1、首先上两个经典的例子:
var a = [];
for (**var** i = 0; i < 10; i++) {
a[i] = function () {
console.log(i); ////////////////10
};
}
a[6]();
变量i是var声明的,在全局范围内都有效。所以每一次循环,新的i值都会覆盖旧值,导致最后输出的是最后一轮的i的值。
var a = [];
for (**let** i = 0; i < 10; i++) {
a[i] = function () {
console.log(i); ////////////////6
};
}
a[6]();
如果使用let,声明的变量仅在块级作用域内有效,最后输出的是6。上面代码中,变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以最后输出的是6。