成人视屏在线观看-国产99精品-国产精品1区2区-欧美一级在线观看-国产一区二区日韩-色九九九

您的位置:首頁技術文章
文章詳情頁

JS關于for循環中使用setTimeout的四種解決方案

瀏覽:99日期:2024-03-28 14:29:37
概述

我們先來簡單了解一下setTimeout延時器的運行機制。setTimeout會先將回調函數放到等待隊列中,等待區域內其他主程序執行完畢后,按時間順序先進先出執行回調函數。本質上是作用域的問題。

因此若是這樣將不會得到想要的結果輸出1.2.3.4.5,而會連續輸出5個6。

for (var i=1; i<=5; i++) { setTimeout( function timer() {console.log( i ); }, i*1000 );}

這是因為setTimeout是異步執行,每一次for循環的時候,setTimeout都執行一次,但是里面的函數沒有被執行,而是被放到了任務隊列里,等待執行。只有主線上的任務執行完,才會執行任務隊列里的任務。也就是說它會等到for循環全部運行完畢后,才會執行fun函數,但是當for循環結束后此時i的值已經變成了6,因此雖然定時器跑了5秒,控制臺上的內容依然是6。

(注意:for循環從開始到結束的過程,需要維持幾微秒或幾毫秒,當定時器跑完一秒之后for循環早已經做完了。)

我們來看另一種情況:

for (var i=1; i<=5; i++) { (function() {setTimeout( function timer() { console.log( i );}, i*1000 ); })();}

由setTimeout的運行機制可以知道,首先會運行外部的所有主程序,雖然for循環內形成了閉包,但是fun并沒有發現一個實參所以跟第一個例子并無實際差別,仍然是連續輸出5個6。

解決方案1:閉包

使用閉包是很經典的一種做法:

for (var i=1; i<=5; i++) { (function(j) {setTimeout( function timer() { console.log( j );}, j*1000 ); })(i);}

我們可以發現跟預期結果一致,依次輸出1到5,因是因為實際參數跟定時器內部的i有強依賴。

通過閉包,將i的變量駐留在內存中,當輸出j時,引用的是外部函數的變量值i,i的值是根據循環來的,執行setTimeout時已經確定了里面的的輸出了。

解決方案2:拆分結構

我們還可以將setTimeout的定義和調用分別放到不同部分:

function timer(i) { setTimeout( console.log( i ), i*1000 );}for (var i=1; i<=5;i++) { timer(i);}

控制臺上輸出依然是依次輸出1到5。

解決方案3:let

這里再來說一說使用es6的let來解決此問題:

for (let i=1; i<=5; i++) { setTimeout( function timer() {console.log( i ); }, i*1000 );}

這個例子與第一個相比,只是把var更改成了let,可是控制臺的結果卻是依次輸出1到5。

因為for循環頭部的let不僅將i綁定到for循環中,事實上它將其重新綁定到循環體的每一次迭代中,確保上一次迭代結束的值重新被賦值。setTimeout里面的function()屬于一個新的域,通過var定義的變量是無法傳入到這個函數執行域中的,通過使用let來聲明塊變量能作用于這個塊,所以function就能使用i這個變量了;這個匿名函數的參數作用域和for參數的作用域不一樣,是利用了這一點來完成的。這個匿名函數的作用域有點類似類的屬性,是可以被內層方法使用的。

解決方案4:setTimeout第三個參數

for (let i=1; i<=5; i++) { setTimeout( function timer() {console.log( i ); }, i*1000, i );}

由于每次傳入的參數是從for循環里面取到的值,所以會依次輸出1到5。

以上就是JS關于for循環中使用setTimeout的四種解決方案的詳細內容,更多關于JS使用setTimeout的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 国产在线精品香蕉综合网一区 | 久久久久成人精品一区二区 | 岛国大片在线播放高清 | 国产日韩精品一区二区三区 | 久久久久免费精品国产 | www操操操| 欧美成人性色xxxx视频 | 怡红院免费va男人的天堂 | 欧美成人aaaa免费高清 | 久草在| 91香蕉成人免费高清网站 | jyzzjyzz国产免费观看 | 成人高清无遮挡免费视频软件 | 国内成人免费视频 | 久久一日本道色综合久久 | 国产精品嘿咻嘿咻在线播放 | 美国一级做a一级视频 | 欧美一级人与动毛片免费播放 | 我要看a级毛片 | 欧美叫床戏做爰无遮挡 | 亚洲最大激情中文字幕 | 亚洲一区二区天海翼 | 给我一个可以看片的www日本 | 黄片毛片在线观看 | 国产www | 伊人狠狠丁香婷婷综合色 | 69精品免费视频 | 中文三 级 黄 色 片 | 91av观看| 久久久久国产一级毛片高清片 | 欧美在线综合 | 日韩亚洲欧美一区噜噜噜 | 俄罗斯aaaa一级毛片 | 国产高清精品一区 | 国产精品久久久久久影视 | 岛国精品成人 | 欧美日韩一区二区三区在线视频 | 久久国产精品99久久久久久牛牛 | 精品国产免费观看一区 | 免费一区在线观看 | 日本视频一区二区三区 |