JavaScript 匿名函数 ,为什么每次返回的都是5?

2025-03-20 08:36:11
推荐回答(5个)
回答1:

function box() {
   var arr = [];
   for (var i = 0; i < 5; i++) {
       arr[i] = function () {
           return i;
       };
   }
return arr;
}
var b = box(); //得到函数数组,数组中存放的是5个方法,然后方法的返回值存放的是i执行最后一次的值。

for循环执行最后的i++后,i=5了,arr[0...4]中存放的方法的返回值都变成5了,最后栈中的i=5销毁。

function box() {

   var arr = [];

   for (var i = 0; i < 5; i++) {

       arr[i] = function () {

           return i+"l";

       };

   }

   alert(arr+"...."+arr[0]());//这里可以测试方法返回值都变成5了

return arr;

}

//alert(i)//这里可以知道栈里面的i值被销毁

var b = box(); //得到函数数组

回答2:

这是一个闭包问题,即作用域

arr[i] = function () {
           return i;
       };

你的数组元素是一个function,但是在方法里使用的是 i 变量,一个上层包变量

所以你在使用var b = box(); //得到函数数组  时,里面的i都是box域中的


只要打断闭包即可:参考下面代码

    function getFn(i) {
        return function() {
            return i;
        };
    }
    function box() {
        var arr = [];
        for ( var i = 0; i < 5; i++) {
            var val = new String(i);
            arr[i] =  getFn(i);
        }
        return arr;
    }
    var b = box(); //得到函数数组
    //alert(b.length); //得到函数集合长度
    for ( var i = 0; i < b.length; i++) {
        document.write(b[i]());
    }

亲,如果回答满意且正确,请即时采纳,你的合作是我回答的动力,谢谢

回答3:

这个 可以换个写法 看着比较容易理解

function box() {
var arr = [];
for (var i = 0; i < 5; i++) {
arr[i] = get;
}
function get(){// 函数是单独的 并没有传值 这个i是for 遍历完之后的值
return i;
};
return arr;
}

实际效果一样的

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

这个其实是你要的结果

回答4:

可以这么说吧arr[i] = function(){return i};这里只是一个定义arr[i]存得是一个匿名函数,但仅仅是定义。当你循环一遍并定义好arr[i]的时候,i这时候是5。当你执行的时候,才执行function(){return i;//这时候执行环境找i并返回。所以你alert出来的都是5}

回答5:

因为调用他时 他会回到他的上下文中寻找 变量i