鍍金池/ 問答/HTML/ ES6中l(wèi)et聲明變量問題

ES6中l(wèi)et聲明變量問題

今天看ES6的一篇文章里這樣寫:

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

文檔中說,上面代碼中,變量i是let聲明的,當前的i只在本輪循環(huán)有效,所以每一次循環(huán)的i其實都是一個新的變量,所以最后輸出的是6。

但是a[6]不是function(){console.log(i)}嗎?當運行a[6]()的時候,由于i是let聲明的,只在塊級作用域中有效,不應該是打印出undefined嗎?怎么會是6呢?

回答
編輯回答
薄荷綠

for每次循環(huán)生成一個新的作用域,fuction內的i訪問的是這個作用域內的i,大概可以像這樣理解:

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

可以將源代碼使用 babel轉義看看:

clipboard.png

2017年9月29日 14:18
編輯回答
旖襯

i是在外部的大括號聲明的,所以在內部的大括號也生效,反之就不行了,可以簡單理解為作用域向下傳遞

2018年1月13日 10:02
編輯回答
笨小蛋

巧了,我正好寫過這個問題的文章,你可以看一下。
。。雖然我當時覺得寫得很清楚,但是現(xiàn)在讀了下,感覺看不懂,不過意思還是這個意思
我之前對這個問題的解析

2017年8月23日 04:52