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呢?去了这句话 就不能正确输出了
2 回答
宝慕林4294392
TA贡献2021条经验 获得超8个赞
如果不用var n=i接收i的值,直接返回i,那么后面函数运行的时候找不到i的值,就回去上层作用域寻找,而上层作用域循环结束,i的值为10,所以会始终返回10。
而使用了var n=i,想当于把每次循环中i的值保存在自调函数的内部,返回函数运行的时候找不到n的值也会去上层作用域寻找,找到了自调函数内部的n的值,分别对应0-9。
可以这么改,作用相同
for(var i=0;i<10;i++){
fnArr[i]=(function(i){
return function(){
return i
}
})(i);
}
添加回答
举报
0/150
提交
取消