循环里匿名函数的返回值问题

在循环中使用匿名函数时,匿名函数的返回值都是5,导致结果为arr=[5,5,5,5,5]

function box(){
    var arr = [];
    for(var i=0;i<5;i++){
        arr[i] = function(){
            return i  
        };
    };
    return arr;
};

var b = box();
for(var i=0;i<5;i++){
    alert(b[i]());   
};

但如果我要得到结果arr = [0,1,2,3,4],我就得把i作为参数传进去并且自我执行

function box(){
    var arr = [];
    for(var i=0;i<5;i++){
        arr[i] = (function(i){
            return i  
        })(i);
    };
    return arr;
};

var b = box();
for(var i=0;i<5;i++){
    alert(b[i]);   
};

请问这是怎么理解的,为什么直接返回i就只能得到i的最终值5?谢谢各位解答!

阅读 2.6k
2 个回答

典型的闭包,函数作用域
一个例子:

var index = 1;
var b = function(){
    console.log(index);
}
index = 2;
b();//输出2 是因为调用的时候才取全局index的值
var index = 1;
var b = (function(i){
    return i  //这里形成独立作用域
})(index);
index = 2;
b();//输出1 是因为调用的时候取的是(function(){})(index)这个函数作用域内的index

闭包函数延迟绑定,只有在调用的时候才会计算i的值,此时i的值循环到了5,第二种情况是因为此时的i是实参i,已经计算得出了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题