代码段1function f(x)
{
var g = function () { return x; }
return g;
}var g1 = f(1);
var g2 = f(2);
alert(g1()); //输出 1
alert(g2()); //输出 2
代码段2function 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
}
同样都是闭包,为什么第1段代码输出的值不同,而第二段相同呢?
{
var g = function () { return x; }
return g;
}var g1 = f(1);
var g2 = f(2);
alert(g1()); //输出 1
alert(g2()); //输出 2
代码段2function 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
}
同样都是闭包,为什么第1段代码输出的值不同,而第二段相同呢?
function a()
{
var array = new Array();
for (var i = 0; i < 10; i++)
{(function(i){
array.push(function() {return i});
})(i)}
return array;
}
var array = a();
for (var i = 0; i < array.length; i++)
{
window.alert(array[i]()); //全是10
}
</script>代码2应该这么写~·才会形成闭包~·
楼主
for (var i = 0; i < 10; i++)
{
array.push(function() {return i});
}这样做。function() {return i}的时候i是在a的变量作用域中
array.length 打出来看看不就知道是什么原因了吗
对不起 是我不细心 1楼是对的 我看错行了 Sorry
{
var array = new Array();
for (var i = 0; i < 10; i++)
{
var j=i;
array.push(function() {return j});
}
return array;
}var array = a();
for (var i = 0; i < array.length; i++)
{
window.alert(array[i]());
}
为什么不一样,
第二个里面,你在a里定义了10 个function,注意这个10 个function 都是在a执行时,一定定义完成的。function 在定义的解析的时候,会有一个[[scope]]属性指向它定义时所在的环境,这10个function 都指向了这一个a执行时的环境,而i就是在这个环境中的一个变量。随着执行的完成,i最后变成了10。当你在外面再通过数组项的function 引用去调这些function 时,这些function 对这个i的解析是同一个,所以会是10。而第一个,你是通过两次执行同一个function,返回两个function 的引用。function 每次执行都没生成不一样的运行环境,返回的这两个function 的[[scope]]的指向也是不一样的,分别两个不同的变量,只是表面名字一样,所以结果也不一样了。