var 聲明
for(var i = 0; i<5; i++){ setTimeout(()=>console.log(i),0) // 5 5 5 5 5 }
上面的代碼因為setTimeout是一個異步,所以它拿到的是循環結束后的i的值,
因為上面我們說的var是全局變量會被覆蓋掉所以最后的i值是5,而且一共循環了5次(0-4),所以會打印五個5。
let 聲明
for(let i = 0; i<5; i++){ setTimeout(()=>console.log(i),0) //0 1 2 3 4
}
上面的代碼,因為在for循環中使用了let聲明循環變量,
所以每一個值都會存在於單獨的作用域不會被覆蓋掉,因此,循環結束后得到的值是0,1,2,3,4
因為let有自己的作用域塊,所以在for循環表達式中使用let其實就等價於在代碼塊中使用let
