直接來乙個經典案例:
// 1. 下面的結果是什麼? 為什麼?
for (var i=0;i<5;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迴圈的大括號限制;
var和let 以及js作用域問題
今天學習es6 的時候發現了var 和 let 之間的不同。var a for var i 0 i 10 i a 6 6 var設定的是全域性變數。陣列中儲存的是指向i的記憶體位址,所以在迴圈中i一直在變化,最後在10就不動了。let設定的是區域性變數,宣告的變數僅在塊級作用域內有效。變數i只在本輪...
關於let作用域
當乙個花括號內宣告用let,此時後花括號內的所有指向 用let宣告的變數 的變數的作用域都被侷限到了這或括號內 例如 for let i 0 i 10 i test 結果為9,因為test是全域性函式,但是i生成了塊級作用域,每次生成test函式都會覆蓋前乙個test函式最後test的i就是最後的i...
JS 作用域 var與let 區別
在es6入門時,最讓人傻傻分不清楚的就是var與let帶來的作用域的苦惱。最近又一次翻看阮一峰老師的文章,重新有了自己的小結。分析 var a for var i 0 i 10 i a 6 10var a for let i 0 i 10 i a 6 6以上兩段 區別在於var與let使用的作用域不...