【引用】判斷for(var i=0;i<=3;i++){ setTimeout(function() { console.log(i) }, 10);}

判斷 for(var i=0;i<=3;i++){ setTimeout(function() { console.log(i) }, 10);} 的輸出內(nèi)容?

答案:打印4次4


解析:

這道題涉及了 異步、作用域、閉包

settimeout是異步執(zhí)行,10ms后往任務隊列里面添加一個任務,
只有主線上的全部執(zhí)行完,才會執(zhí)行任務隊列里的任務,
當主線執(zhí)行完成后,i是4,所以此時再去執(zhí)行任務隊列里的任務時,i全部是4了。

對于打印4次是:

 每一次for循環(huán)的時候,setTimeout都執(zhí)行一次,
但是里面的函數(shù)沒有被執(zhí)行,而是被放到了任務隊列里面,等待執(zhí)行,
for循環(huán)了4次,就放了4次,當主線程執(zhí)行完成后,才進入任務隊列里面執(zhí)行。

\color{red}{ ( 注意:for循環(huán)從開始到結束的過程,需要維持幾微秒或幾毫秒.)}

當把var 變成let 時:

打印出的答案:0,1,2,3

解析:

for循環(huán)頭部的let不僅將i綁定到for循環(huán)塊中,
它也將其重新綁定到 **循環(huán)體的每一次迭代** 中,確保上一次迭代結束的值重新被賦值。

setTimeout里面的function()屬于一個新的域,
通過 var 定義的變量是無法傳入到這個函數(shù)執(zhí)行域中的,
而通過使用 let 來聲明塊變量,這時候變量就能作用于這個塊,
所以 function就能使用 i 這個變量了;

這個匿名函數(shù)的參數(shù)作用域 和 for參數(shù)的作用域 不一樣。
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容