var arr = [] ;
for(var i=0;i<10;i++){
arr[i] = function(){
console.log(i)
}
}
arr[5]() //这个打印结果为什么是10而不是5
3 回答
安然桑丶
TA贡献25条经验 获得超1个赞
因为此时循环结束后, i是10, 因此不管你调用`arr[5]()`还是`arr[6]()`都是打印10.
解决这种问题 ES3/5 可以使用闭包和自执行函数. 最简洁的还是将`var`声明替换为`let`. 不过这是ES6的语法.
ES3/5方式:
var arr = [] ;
for(var i=0;i<10;i++){
arr[i] = (function(i){
return function () {
console.log(i)
}
})(i)
}
arr[5]() // 5
arr[9]() // 9
慕勒7123956
TA贡献35条经验 获得超15个赞
你把var变成let 就是你想要的了,因为函数里面只是一个console.log() 动作.里面的变量i是这10个函数公用的一个变量。所以循环结束,i就变成了10.
用let的话,就是把每一个循环变成了块级作用域,也可以利用函数作用域
arr[i]=function(){
var temp=i;
console.log(temp);
}
}添加回答
举报
0/150
提交
取消
