直接來一個經典案例:
// 1. 下面的結果是什么? 為什么?
for (var i=0;i<5;i++){
setTimeout(function () {
console.log(i)
},1000)
}
setTimeout是異步執行的,1000毫秒后向任務隊列里添加一個任務,只有主線上的全部執行完才會執行任務隊列里的任務,
所以當主線程for循環執行完之后 i 的值為5,
這個時候再去任務隊列中執行任務,i全部為5;
每次for循環的時候setTimeout都會執行,但是里面的function則不會執行被放入任務隊列,因此放了5次;for循環的5次執行完之后不到1000毫秒;
1000毫秒后全部執行任務隊列中的函數,所以就是輸出五個5啦
假如把var換成let,那么輸出結果為0,1,2,3,4;
因為let i 的是區塊變量,每個i只能存活到大括號結束,並不會把后面的for循環的 i 值賦給前面的setTimeout中的i;
而var i 則是局部變量,這個 i 的生命周期不受for循環的大括號限制;