日期:2014-05-16 浏览次数:20375 次
function a() { var array = new Array(); for (var i = 0; i < 10; i++) { array.push(function() {return i}); } return array; } var array = a(); for (var i = 0; i < array.length; i++) { window.alert(array[i]()); //全是10 }
function a() { var array = new Array(); for (var i = 0; i < 10; i++) { array.push(function() {return i}); //这个i并不是内部函数的局部变量,怎么会是闭包呢,function(i) {return i;} 这个内部函数的局部变量i才是闭包 } return array; }
------解决方案--------------------
纯粹的闭包
只是不是你想象中的闭包
------解决方案--------------------
function() {return i} 这样的语句并没有被执行,只是构建了一个函数体为return i;的函数对象,仅此而已。当i=10时,迭代停止,外部函数返回。当再去调用array[i]()时,i的值依旧为10。因此每一个元素的array都返回i=10。 跟我之前看到的一个例子一样,很相似……
------解决方案--------------------
都是闭包。
函数执行创建作用域,函数声明绑定作用域。
<script> function f(x) { var g = function () { return x; } return g; } </script>
------解决方案--------------------
所以你每次执行f,都会重新声明一次g,然后g里面的x因为本身未定义,就会到f域去找。
------解决方案--------------------
而你主贴贴的代码,不是闭包还能是啥呢?
------解决方案--------------------
闭包是一个动态的概念,是在函数运行时存在的,如果当前函数内没有此变量,则从父函数中去直至到顶。所以欲行时取i,此时i为10