forサイクルにおけるlet iとvar iの違い

981 ワード

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
コードには2つの大域変数が存在し、配列aと循環変数iとは、配列内の各要素に1つの匿名関数が保存されています.この関数は循環変数iを参照しています.a[0]()を呼び出した場合、i値はすでに10回循環した後の変数値10です.
関数内にループ毎の値を保存する場合は、即時関数式またはletブロックレベルの循環作用領域を使用することができます.
後者はes 6文法を使って、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