- 作用域
var a = [];
for (var i = 0; i < 10; i++) {
var c = i;
a[i] = function () {
console.log(c);
};
}
a[6](); // 9
var a = [];
for (var i = 0; i < 10; i++) {
let c = i;
a[i] = function () {
console.log(c);
};
}
a[6](); // 6
使用let方法实际上是把代码改为:
var a = [];
for (var i = 0; i < 10; i++)
(function(c) {
a[i] = function() {
console.log(c);
};
}(i));
a[6]();
首先看a[i]这个函数
a[i] = function () {
console.log(c);
};
本质上是输出变量c的值,那么变量c的本质就很重要。变量c的本质是什么呢?
用var 时,变量c的作用域是函数,在这里为全局变量,for语句执行完后,c在全局为9,所以a[6] = console.log(c),为9;用let时,变量c的作用域为块(跟c,java一样)
在这里作用域只是在for语句里面,相当于每次循环都给console.log(c)指定了一个值,所以a[6] = console.log(6),为6。