首页 > es6中关于let的一个疑问?

es6中关于let的一个疑问?

var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 6

为什么在外部调用a[6]()可以访问到for循环内部定义的变量i?是作用域链发生了变化吗?


首先,先说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在整个函数体内有效,所以可以累加。
以上结论都是我猜得,没实践过,错了不要怪我(:


这个是闭包,


《js高级程序设计》中闭包的概念是指有权访问另外一个函数作用域中的变量的函数。我想这里用let创建了块级作用域,也就相当于是一个闭包的环境。


抱歉没有注意到题主的重点是 let,下面答案 var 时可用,let 没研究期待高手回答


作用域链顶端是循环中定义的那个函数,这个函数没有被释放,i就不会被释放,所以可以访问的到。
另外,这个函数没有形成闭包,所以a[0]()a[9]()的输出结果都是相同的,不是0-9而是10。

【热门文章】
【热门文章】