for(var i=0;i<10;i++){
fnArr[i]=(function(){
var n=i;
return function(){
return n
}
})();
}
for(var i=0;i<10;i++){
(function(){
var n=i;
fnArr[i]=function(){
return n
};
})()
}
以上都是可以让 fnArr[3]输出3,而不是10,但是为什么一定都要声明n=i呢?去了这句话 就不能正确输出了
如果不用
var n=i
接收i的值,直接返回i,那么后面函数运行的时候找不到i的值,就回去上层作用域寻找,而上层作用域循环结束,i的值为10,所以会始终返回10。而使用了
var n=i
,想当于把每次循环中i的值保存在自调函数的内部,返回函数运行的时候找不到n的值也会去上层作用域寻找,找到了自调函数内部的n的值,分别对应0-9。可以这么改,作用相同