你還在用var定義變數嗎?

Meriodas發表於2021-06-05

先來一個例子

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

上面程式碼中,變數i是var宣告的,在全域性範圍內都有效,所以全域性只有一個變數i。每一次迴圈,變數i的值都會發生改變,而迴圈內被賦給陣列a的function在執行時,會通過閉包讀到這同一個變數i,導致最後輸出的是最後一輪的i的值,也就是10。

而如果使用let,宣告的變數僅在塊級作用域內有效,最後輸出的是6。

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

上面程式碼中,變數ilet宣告的,當前的i只在本輪迴圈有效,所以每一次迴圈的i其實都是一個新的變數,所以最後輸出的是6。你可能會問,如果每一輪迴圈的變數i都是重新宣告的,那它怎麼知道上一輪迴圈的值,從而計算出本輪迴圈的值?這是因為 JavaScript 引擎內部會記住上一輪迴圈的值,初始化本輪的變數i時,就在上一輪迴圈的基礎上進行計算。

另外,for迴圈還有一個特別之處,就是迴圈語句部分是一個父作用域,而迴圈體內部是一個單獨的子作用域。

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

實際上我相信在任何場景幾乎都可以用let來替換var。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
K'

相關文章