var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 6
为什么在外部调用a[6]()
可以访问到for循环内部定义的变量i
?是作用域链发生了变化吗?
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 6
为什么在外部调用a[6]()
可以访问到for循环内部定义的变量i
?是作用域链发生了变化吗?
抱歉没有注意到题主的重点是 let,下面答案 var 时可用,let 没研究期待高手回答
作用域链顶端是循环中定义的那个函数,这个函数没有被释放,i就不会被释放,所以可以访问的到。
另外,这个函数没有形成闭包,所以a[0]()
到a[9]()
的输出结果都是相同的,不是0-9而是10。
首先,先说var:
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
不论
a[6]();
还是
a[9]();
其结构都是9;
原由是a[6]和a[9]是一个函数名,对应的是内部的
function () {
console.log(i);
};
i已经为9,所以结果都是9;
再说let:
let是块级作用域声明变量,for的时候相当于声明了a[0]~a[9]一共9个函数,即for的每个i都只在自己的域内有效(for的每个循环都视为一个块),而var的i在整个函数体内有效,所以可以累加。
以上结论都是我猜得,没实践过,错了不要怪我(:
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
这个是闭包,
《js高级程序设计》中闭包的概念是指有权访问另外一个函数作用域中的变量的函数。我想这里用let创建了块级作用域,也就相当于是一个闭包的环境。