日期:2014-05-16 浏览次数:20458 次
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