- 通常写法;
function test(){
var arr=[];
for(var i=0;i<10;i++){
arr[i]=function(){
console.log(i);
}
}
return arr;
}
var newTest=test();
for(var j=0;j<10;j++){
newTest[j](); //10个10
}
实际运行中,arr数组中的函数在执行时,才会关注arr中每一个函数的内部函数体是什么,此时在函数中打印 i 值,则就会去作用域链中寻找 i 值,i 值存在于test函数的AO中,所有的arr函数都是使用的同一条test的AO,所以 i 值相同,而当 i 值= 10时,循环停止,所以最后 i = 10; 每个函数执行都打印 10;
解决方案:
function test(){
var arr=[];
for(var i=0;i<10;i++){
(function(j){
arr[j]=function(){
console.log(j);
}
}(i))
}
return arr;
}
var newTest=test();
for(var j=0;j<10;j++){
newTest[j](); //0到9
}
在循环添加函数时,使用立即执行函数,立即执行函数执行完毕后立即销毁,打印传入的实参值,使用的立即执行函数的AO,每个循环都添加一个立即执行函数,相互之间互不影响。