为了账号安全,请及时绑定邮箱和手机立即绑定

请教一个js里的循环问题。

请教一个js里的循环问题。

慕田峪8701529 2018-03-13 22:35:14
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


查看完整回答
反对 回复 2018-03-14
?
慕勒7123956

TA贡献35条经验 获得超15个赞

你把var变成let 就是你想要的了,因为函数里面只是一个console.log() 动作.里面的变量i是这10个函数公用的一个变量。所以循环结束,i就变成了10.

用let的话,就是把每一个循环变成了块级作用域,也可以利用函数作用域

arr[i]=function(){
var temp=i;
console.log(temp);
}
}


查看完整回答
反对 回复 2018-03-14
?
anet

TA贡献79条经验 获得超19个赞

注意看循环体

只是简单的赋值操作而已

循环结束,i的值为10,这个时候输出自然为10

查看完整回答
反对 回复 2018-03-13
  • 3 回答
  • 0 关注
  • 1655 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信