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) }