i < 3; i++){
a[i] = function(){//a[i]是一个闭包
return i;
}}
return a;
}
var fun = f();
alert(fun[0]()); //output 3
alert(fun[1]()); //output 3
alert(fun[2]()); //output 3
补充说明:
l按照预期,最终结果应该输出 [0 , 1 , 2 ],但是却是[ 3 , 3 , 3 ]。l在函数 f ( ) 中,我们通过循环,创建了三个闭包,它们都指向了共同的局部变量 i 。例如2:(对比例1)l但是,闭包并不会记录它们的值,它们所拥有的只是一个 i 的连接(即引用),因此只能返回i 的当前值。
function f(){
var a = [];
var i;
for(i = 0; i < 3; i++){
a[i] = (function(x){
return x;
})(i);
}
return a;
}
var fun = f();
alert(fun[0]); //output 0
alert(fun[1]); //output 1
alert(fun[2]); //output 2
补充说明:
l在这里,我们不再直接创建一个返回i 的函数,而是将i 传递给了一个自调函数。例如3:下 面这种,是不使用自调函数的用法。l在该自调函数中,i 就被赋值给了局部变量x ,这样一来,每次迭代中的x 就会拥有各自不同的值了。
function f(){
function n(x){
return x;
}
var a = [];
var i;
for(i = 0; i < 3; i++){
a[i] = n(i);
}
return a;
}
var fun = f();
alert(fun[0]); //output 0
alert(fun[1]); //output 1
alert(fun[2]); //output 2