ES6 中 let的在for循環中變量作用域問題的探討

如果你直接這麼運行,那麼電腦就卡死了,因爲死循環了。

for (var i = 0; i < 3; i++) {
    var i = 1;
  console.log(i);
}

可是如果你這麼寫

for (let i = 0; i < 3; i++) {
  let i = 1;
  console.log(i);

結果則是:

1
1
1

如果你這麼寫,結果同上

for (var i = 0; i < 3; i++) {
  let i = 1;
  console.log(i);
}

如果你這麼寫,會報錯

for (let i = 0; i < 3; i++) {
  var i = 1;
  console.log(i);
} // SyntaxError: Identifier 'i' has already been declared

這是因爲let在for循環語句中是父作用域。循環體內部是子作用域。
所以如果我們用let在for循環體內部用i定義變量的話,那麼媽媽再也不用擔心我敲電腦敲出死機了。

當然如果你在循環體內部直接運用i也是可以的,這樣 i 會直接運用到子作用域。

for (let i = 0; i < 3; i++) {
  console.log(i);
}

如果你這麼寫,也是會報錯,因爲對於var來講它是不會區分循環體內部和循環語句的變量作用域的。

for (let i = 0; i < 3; i++) {
  var i = 0;
  console.log(i);
} // SyntaxError: Identifier 'i' has already been declared

再寫個let在塊級作用域的例子,我們一起來感受下:

{
    let i = 0;
    if (true) {
        let i = 2; 
        console.log(i);
    }
    console.log(i);
}

結果:

2
0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章