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
提交
取消