for (var i = 0; i < 3; i++) , 30 * 100)
console.log(i) // 先輸出 0 1 2
}
1、這道題涉及到了非同步、作用域、閉包:
settimeout是非同步執行,10ms後往任務佇列裡面新增乙個任務,只有主線上的全部執行完,才會執行任務佇列裡的任務,當主線執行完成後,i是3,所以此時再去執行任務佇列裡的任務時,i全部是3了。對於列印3次是:
每一次for迴圈的時候,settimeout都執行一次,但是裡面的函式沒有被執行,而是被放到了任務佇列裡面,等待執行,for迴圈了3次,就放了3次,當主線程執行完成後,才進入任務佇列裡面執行。
(注意:for迴圈從開始到結束的過程,需要維持幾微秒或幾毫秒。)
2、當解決變數作用域:
for (let i = 0; i < 3; i++) , 3000)
console.log(i) // 先輸出 0 1 2
}
因為for迴圈頭部的let不僅將i繫結到for迴圈塊中,事實上它將其重新繫結到迴圈體的每一次迭代中,確保上一次迭代結束的值重新被賦值。settimeout裡面的function()屬於乙個新的域,通過 var 定義的變數是無法傳入到這個函式執行域中的,通過使用 let 來宣告塊變數,這時候變數就能作用於這個塊,所以 function就能使用 i 這個變數了。
附:由於 var 命令的變數提公升機制,var 命令實際只會執行一次。而 let 命令不存在變數提公升,所以每次迴圈都會執行一次,宣告乙個新變數(但初始化的值不一樣)。for 的每次迴圈都是不同的塊級作用域,let 宣告的變數是塊級作用域的,所以也不存在重複宣告的問題。let宣告變數的for迴圈裡,每個匿名函式實際上引用的都是乙個新的變數。
再熟悉一遍:
for (var i = 3; i > 0; i--) , 30 * 100)
console.log(i) // 先輸出 3 2 1
}
for (let i = 3; i > 0; i--) , 30 * 100)
console.log(i) // 先輸出 3 2 1
}
for迴圈中let和var的區別
先看2段 使用var宣告,得到3個3 var a for var i 0 i 3 i a 0 3a 1 3a 2 3 使用let宣告,得到0,1,2 var a for let i 0 i 3 i a 0 0a 1 1a 2 2這是為什麼呢?首先要知道var 宣告作用域是函式作用域,let宣告的作用...
for迴圈中let和var的區別
對呀初學j ascript的同學來說,變數提公升永遠都是過不去的坎,相信我們都遇到過這種情況,看下面 var var arr for var i 0 i 10 i arr 2 輸出為10變數i是var命令宣告的,在全域性範圍內都有效,所以全域性只有乙個變數i。每一次迴圈,變數i的值都會發生改變,而迴...
let和var在for迴圈中的不同表現
var只有函式作用域,沒有塊級作用域 函式作用域的表現 function test test 10 console.log i i is not defined 塊級作用域對var沒有約束 console.log i 10 從上面的 可了解到,塊級作用域對var是沒有約束作用的。let與var不同,...