function test(){
var arr=[];
for(var i=0; i<10; i++){
arr[i]=function (){
console.log(i);
}
}
return arr;
}
var myArr=test();
for(var i=0; i<10; i++){
myArr[i]();
}
arr[i]=function (){
}
是一个 函数表达式
只有 myArr[i]();时,它里面的语句 console.log(i); 才会执行,输出 i
test函数,在里面定义一个 数组,让每个函数 都由 数组中的一位 接收,形成 函数表达式,最后 返回 数组
执行test,用一个变量 接收,得到的 其实是 数组。
再用 for循环,执行数组的每一位,相当于 把每一个函数 执行
为什么得到的 i都是 10?
因为 i 最终就加到 10
解决:
function test(){
var arr=[];
for(var i=0; i<10; i++){
(function (j){
arr[j]=function (){
console.log(j);
}
}(i))
}
return arr;
}
var myArr=test();
for(var i=0; i<10; i++){
myArr[i]();
}
在 for里面
arr[j]=function (){
console.log(j);} 外面 套了层 立即执行函数
解决原理在于 立即执行函数 保住了每一个i 0,1,2,3…… 每个小函数都被自己的立即函数包裹保存到外部
每个myArr[i]() 执行,小函数输出的i 都是 立即执行函数保存的j
所以,重点在:
1.每个小函数 都有自己的立即执行函数 十个函数 对 十个函数 不是之前 十个函数 对应一个 test函数
i是共同变量 for每次循环 i都++ 最后变成10
2.立即执行函数 保存了 每一次的i