var let 在for循環中的區別

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

爲什麼結果是10而不是5呢?
思路1:首先,此處的i是全局變量,在for循環結束後,i=10。
其次,循環中,數組a中的所有值都指向function(){},這個方法被不斷的重寫,即i=0時,指向log(0);i=1時,i=0和i=1都指向了log(1);執行到a[9]時,a[0]~a[9] 都指向了log(9)。但是i又++,所以i變成了10。
思路2:上面代碼中,變量i是var命令聲明的,在全局範圍內都有效,所以全局只有一個變量i。每一次循環,變量i的值都會發生改變,而循環內被賦給數組a的函數內部的console.log(i),裏面的i指向的就是全局的i。也就是說,所有數組a的成員裏面的i,指向的都是同一個i,導致運行時輸出的是最後一輪的i的值,也就是 10。

for(var i = 0 ;i<10;i++){
var c = i;
arr[i] = function(){ console.log(c) };
}

arr[5] // 9

這裏結果是9,因爲打印的變量是c,將i=9賦值給c,所以c=9。最後i=10時,跳出了循環,沒有給c賦值10。

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

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

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