for循环中let i 和var i 的区别

 var i :

var a = [];
for (var i = 0; i < 10; i++) {
    a[i] = function () {
        console.log(i);
    };
}

a[0](); //10
a[1](); //10
a[2](); //10
a[3](); //10
a[4](); //10
a[5](); //10
a[6](); //10
a[7](); //10
a[8](); //10
a[9](); //10
a[10](); //Uncaught TypeError: a[10] is not a function

代码中存在两个全局变量,数组a与循环变量i,数组中每个元素保存着一个匿名函数,该函数引用了循环变量i。在调用a[0]() 时,i值是已经循环10次后的变量值10.

如果想要在函数体内保存每次循环时的值,可以用即时调用函数表达式或使用let块级循环作用域。

后者使用es6语法,将 var i  改为 let i 即可,保证10个函数元素,依次打印0,1,2...

否则按照你当前的写法,a数组的10个函数调用的结果全部是 10, 而不是循环时的变量。

 let i :

var a = [];
for (let i = 0; i < 10; i++) {
    a[i] = function () {
        console.log(i);
    };
}
a[0](); //0
a[1](); //1
a[2](); //2
a[3](); //3
a[4](); //4
a[5](); //5
a[6](); //6
a[7](); //7
a[8](); //8
a[9](); //9
a[10](); //Uncaught TypeError: a[10] is not a function

参考:

http://www.imooc.com/wenda/detail/564480

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值