[英]immediately-invoked function calling setTimeout calling for loop
在以下場景中,事件setTimeout
進入隊列,只有在堆棧清除后,i = 3 才會打印 3 次
//ver1
for (var i = 0; i < 3; i ++ ) setTimeout(()=> console.log(i), 3)
以下將按順序打印1 2 3
因為i
被捕獲在func
x ??
//ver2
for (var i = 0; i < 3; i++) {
(function x(i) {
setTimeout(() => {console.log(i)}, 30)
})(i);
}
為什么下面只打印2
一次?
//ver3
for (var i = 0; i < 3; i++) {
function x(i) {
setTimeout(() => {console.log(i)}, 30)
}(i);
}
我主要在ver2
和ver3
之間感到困惑
編輯: ver2
解釋可以在這里找到。 關於為什么ver3
只打印2
任何見解?
您的第 3 版根本沒有做您認為的那樣。 括號在 IIFE 上不是可選的。 但是因為您為函數命名,它確實被解析為函數聲明:
for (var i = 0; i < 3; i++) {
function x(i) {
setTimeout(() => {console.log(i)}, 30)
}
(i);
}
你從來沒有在這里調用x(…)
。 (i)
只是一個計算i
變量的不必要的括號表達式。 您的代碼執行與
for (var i = 0; i < 3; i++) {
i;
}
那么為什么這個日志2
在控制台中? 因為當您在控制台上運行它時,它會打印最后評估的語句的結果值: i
,它在循環的最后一次迭代中具有值2
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.