非同步 作用域 閉包

2021-09-29 06:16:48 字數 999 閱讀 2557

for(var i=0;i<=3;i++), 10);}

答案:列印4次4

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

settimeout是非同步執行,10ms後往任務佇列裡面新增乙個任務,只有主線上的全部執行完,才會執行任務佇列裡的任務,當主線執行完成後,i是4,所以此時再去執行任務佇列裡的任務時,i全部是4了。對於列印4次是:

每一次for迴圈的時候,settimeout都執行一次,但是裡面的函式沒有被執行,而是被放到了任務佇列裡面,等待執行,for迴圈了4次,就放了4次,當主線程執行完成後,才進入任務佇列裡面執行。

(注意:for迴圈從開始到結束的過程,需要維持幾微秒或幾毫秒。)

當我把var 變成let 時

for(let i=0;i<=3;i++), 10);}

列印出的是:0,1,2,3

當解決變數作用域,

因為for迴圈頭部的let不僅將i繫結到for迴圈快中,事實上它將其重新繫結到迴圈體的每一次迭代中,確保上一次迭代結束的值重新被賦值。settimeout裡面的function()屬於乙個新的域,通過 var 定義的變數是無法傳入到這個函式執行域中的,通過使用 let 來宣告塊變數,這時候變數就能作用於這個塊,所以 function就能使用 i 這個變數了;這個匿名函式的引數作用域 和 for引數的作用域 不一樣,是利用了這一點來完成的。這個匿名函式的作用域有點類似類的屬性,是可以被內層方法使用的。

settimeout是一次執行函式,這裡是10ms後執行,僅僅執行一次;for(var i=0;i<=3;i++),i的每次取值都是執行settimeout這個函式,並沒有執行settimeout裡面的function(即閉包函式),settimeout裡面的function是有settimeout的定時觸動的,也就是10ms後執行,也就是說i從0~3時,一共執行了4次的settimeout()函式,此時的i的值是4,由於for語句的執行速度遠小於1秒,所以,1秒後,由settimeout()函式定時觸動的閉包函式function()開始執行,alert(i);i的值已經是4了,所以相繼列印4次i.

非同步,作用域,閉包

for var i 0 i 3 i 10 答案 列印4次4 這道題涉及了非同步 作用域 閉包 settimeout是非同步執行,10ms後往任務佇列裡面新增乙個任務,只有主線上的全部執行完,才會執行任務佇列裡的任務,當主線執行完成後,i是4,所以此時再去執行任務佇列裡的任務時,i全部是4了。對於列印...

作用域 閉包

1.js執行順序 語法分析 預編譯 先生成go物件 1.函式執行生成ao物件 2.形參和變數作為ao物件的鍵名,鍵值是undefined 3.實參賦值給形參 4.在函式中找到函式宣告,把函式作為ao物件的屬性名,屬性值為函式體 執行js 作用域 變數作用範圍 1.作用域 變數作用範圍 1 函式作用域...

作用域,閉包,作用域鏈

一,作用域 變數在宣告它的函式及該函式所巢狀的任意函式是有定義的 例var num 2 function fun fun 二,作用域鏈 多個函式巢狀在一起,多個作用域相互巢狀,這是作用域鏈 var num 1 function fun function fun2 fun1 fun2 fun 訪問原則...