for迴圈 setTimeout的延遲操作

2022-07-22 07:36:15 字數 950 閱讀 3222

1

for (var i = 0; i < 5; i++) , 100)

5 }

上述**,輸出結果顯而易見是5個5,且並沒有任何的延遲效果。那麼為什麼呢?

首先這樣的結果需要從js的執行機制說起。js是單執行緒環境,也就是說**的執行是從上到下,依次執行。這樣的執行稱為同步執行。因為種種不要浪費和節約的原因。js中引進了非同步的機制。在這段**中,哪個是同步哪個是非同步呢?for迴圈是同步**,而settimeout中的是非同步**。那麼js碰到這個有同步和非同步的情況下會先從上到下執行同步**,碰到非同步的**會將其插入到任務佇列當中等待。而settimeout是延時,也就是說碰到settimeout這個非同步的**塊會根據它裡面的第二個引數:延時時間來將**插入到任務佇列當中,比如上面這段**中,第二個引數延時時間是100,也就是說執行到它的時候會在100ms之後將它插入到任務佇列當中。同步**都執行完成之後,那麼js引擎就空閒了,這個時候就輪到任務佇列中的非同步**依次載入了。

這是上面這段**的答案的一半。另一半就來自於作用域,作用域是變數等資源的作用範圍。在這段**中準確的說是作用域鏈的問題,當同步**執行完畢開始執行非同步的settimeout**時,settimeout中需要乙個變數i,而執行的時候在當前的作用域中開始找,找不到變數i的定義,這個時候就把建立這個函式的作用域作為當前作用域,再次尋找,建立這個函式的作用域就是全域性作用域,也就是找到了for迴圈中i,找到了之後就結束尋找變數i的行程。由於這個時候的i是全域性的,而且人家已經變為了最終形態:5,settimeout找到的就是這個i=5;所以就輸出了5,下面的4次settimeout 的執行都是類似,所以結果都是5;

所以我對這個答案的理解歸結起來就是  非同步載入+作用域鏈。

1

for (var i = 0; i < 5; i++) , 100 *i);

6})(i);

7 }

將延遲操作閉包,立即執行。

settimeout與for迴圈的問題

for var i 0 i 5 i 1000 console.log i 666666以上控制台輸出結果是66666.為什麼嗎?所以當我們執行for迴圈的時候是迴圈完畢的時候在執行settimeout這個方法所以都是66666 為了避免上,面的情況我們用了立即執行函式 1.function 其實就是...

關於for迴圈與setTimeout的延遲

在for迴圈中使用settimeout時,想使其每個settimeout在上乙個settimeout的基礎上進行延時,使用傳入陣列方式設定時間時,發現實際是按照每次設定的settimeout的延時執行的,而不是相加,例 let time 4,3,5,1,2 for let i 0 i time.le...

js中關於setTimeOut()迴圈的問題

function stop function checktime i return i function fun2 week function starttime starttime 上面 執行起來是沒錯 若是這樣呢 while true 今天同學問到了這個為啥不能用迴圈呢,我給的解釋就是用迴圈沒有...