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

你可能感兴趣的:(javascript,es6)