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(); //得到函数数组
这是一个闭包问题,即作用域
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]());
}
亲,如果回答满意且正确,请即时采纳,你的合作是我回答的动力,谢谢
这个 可以换个写法 看着比较容易理解
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;
}
这个其实是你要的结果
可以这么说吧arr[i] = function(){return i};这里只是一个定义arr[i]存得是一个匿名函数,但仅仅是定义。当你循环一遍并定义好arr[i]的时候,i这时候是5。当你执行的时候,才执行function(){return i;//这时候执行环境找i并返回。所以你alert出来的都是5}
因为调用他时 他会回到他的上下文中寻找 变量i