從經典面試題看var與let

for (var index = 0; index < 5; index++) {
  setTimeout(function (){
    console.log(index);//5
  }, 10)
}
console.log(index)// 5

這是個老生常談的問題,可是今天我才明白過來實際是怎麼回事。
使用ES6語法的話,修改以下函數

for (let index = 0; index < 5; index++) {
  setTimeout(function (){
    console.log(index);//0,1,2,3,4
  }, 10)
}
console.log(index)// ReferenceError: index is not defined

var是在全局範圍有效,因此執行setTimeout裏的函數時,先是在函數內部尋找 index 變量,沒有找到,因此去外層找,找到!這時index已經執行完循環,因此值爲5;
let則是聲明在for循環的內部的,每一次for循環,一個block上下文,每次for循環都創建以下block。code

{
   let index = 0;
   setTimeout(function (){
     console.log(index);
   }, 10)
}

這也就解釋瞭如下代碼運行正常io

for(const index of array)

那麼,var的for循環裏發生了什麼呢?console

var index;//變量提高
{
   index = 0;
   setTimeout(function (){
     console.log(index);
   }, 10)
}
相關文章
相關標籤/搜索