成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript的setTimeout和setInterval的深入理解

myeveryheart / 387人閱讀

摘要:所以其實和所謂的異步調(diào)用事實上是通過將代碼段插入到代碼的執(zhí)行隊列中實現(xiàn)的。當(dāng)執(zhí)行和的時候,會根據(jù)你設(shè)定的時間準(zhǔn)確地找到代碼的插入點。綜上所述,其實終歸是單線程產(chǎn)物。無論如何異步都不可能突破單線程這個障礙。

發(fā)表過一片博客《跟著我用JavaScript寫計時器》,比較基礎(chǔ).....有網(wǎng)友說應(yīng)該寫一下setTimeout的原理和機制,嗯,今天就來寫一下吧:

直奔主題:setTimeout和setInterval是如何工作的呢?

我們知道,js是單線程執(zhí)行的(單線程j就是說在程序執(zhí)行時,所走的程序路徑按照連續(xù)順序排下來,前面的必須處理好,后面的才會執(zhí)行)。所以其實setTimeout和setInterval所謂的“異步調(diào)用”事實上是通過將代碼段插入到代碼的執(zhí)行隊列中實現(xiàn)的。
而如何計算插入的時間點呢?自然是要用到我們所說的timer,也就是計時器。當(dāng)執(zhí)行setTimeout和setInterval的時候,timer會根據(jù)你設(shè)定的時間“準(zhǔn)確”地找到代碼的插入點。當(dāng)隊列“正常”地執(zhí)行到插入點時,就觸發(fā)timer callback,也就是我們設(shè)定的回調(diào)函數(shù):

 
function fn() { 
/* 
here is some codes 
*/ alert("javascript");
setTimeout(function() {alert("ok!")},1000); 
} 
onload=fn;

上面這個例子就是我們通常的用法,應(yīng)該容易理解??墒牵瑃imer真的能那么準(zhǔn)確么?代碼隊列的執(zhí)行真的能那么正常么?

還記得嗎?重新認(rèn)識所謂的“異步”

剛剛已經(jīng)知道,事實上setTimeout和setInterval只是簡簡單單地通過插入代碼到代碼隊列來實現(xiàn)代碼的延遲執(zhí)行(或者說異步執(zhí)行)。但是事實上所謂的異步只是一個假象——它同樣運行在一個線程上! 始終是單線程!
那么問題就來了,要是在代碼插入點前的代碼執(zhí)行時間超過了傳入setTimeout或setInterval的設(shè)定時間會怎樣呢?讓我們來看看這段代碼:

 
function fn() { 
setTimeout(function(){alert("can you see me?");},1000); 
while(true) {} 
} 

你覺得這段代碼的執(zhí)行結(jié)果是什么呢?答案是,alert永遠(yuǎn)不會出現(xiàn)。

這是為什么呢?因為,while這段代碼沒有執(zhí)行完(如圖,瀏覽器一直在解析while的代碼),所以插入在后面的代碼便永遠(yuǎn)不會執(zhí)行。
綜上所述,其實JS終歸是單線程產(chǎn)物。無論如何“異步”都不可能突破單線程這個障礙。所以許多的“異步調(diào)用”(包括Ajax)事實上也只是“偽異步”而已。只要理解了這么一個概念,也許理解setTimeout和setInterval也就不難了。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/49648.html

相關(guān)文章

  • JavaScriptsetTimeoutsetInterval深入理解

    摘要:所以其實和所謂的異步調(diào)用事實上是通過將代碼段插入到代碼的執(zhí)行隊列中實現(xiàn)的。當(dāng)執(zhí)行和的時候,會根據(jù)你設(shè)定的時間準(zhǔn)確地找到代碼的插入點。綜上所述,其實終歸是單線程產(chǎn)物。無論如何異步都不可能突破單線程這個障礙。 發(fā)表過一片博客《跟著我用JavaScript寫計時器》,比較基礎(chǔ).....有網(wǎng)友說應(yīng)該寫一下setTimeout的原理和機制,嗯,今天就來寫一下吧: 直奔主題:setTimeout和...

    cgh1999520 評論0 收藏0
  • JS 異步實現(xiàn)

    摘要:由于引擎同一時間只執(zhí)行一段代碼這是由單線程的性質(zhì)決定的,所以每個代碼塊阻塞了其它異步事件的進(jìn)行。這意味著瀏覽器將等待著一個新的異步事件發(fā)生。異步的任務(wù)執(zhí)行的順序是不固定的,主要看返回的速度。 我們經(jīng)常說JS是單線程的,比如node.js研討會上大家都說JS的特色之一是單線程的,這樣使JS更簡單明了,可是大家真的理解所謂JS的單線程機制嗎?單線程時,基于事件的異步機制又該當(dāng)如何,這些知識...

    sihai 評論0 收藏0
  • 理解javascript事件循環(huán)(Event Loop)

    摘要:主線程會暫時存儲等異步操作,直接向下執(zhí)行,當(dāng)某個異步事件觸發(fā)時,再通知主線程執(zhí)行相應(yīng)的回調(diào)函數(shù),通過這種機制,避免了單線程中異步操作耗時對后續(xù)任務(wù)的影響。 背景 在研究js的異步的實現(xiàn)方式的時候,發(fā)現(xiàn)了JavaScript 中的 macrotask 和 microtask 的概念。在查閱了一番資料之后,對其中的執(zhí)行機制有所了解,下面整理出來,希望可以幫助更多人。 先了解一下js的任務(wù)執(zhí)...

    mykurisu 評論0 收藏0
  • setTimeout-setInterval看JS線程

    摘要:提出標(biāo)準(zhǔn),允許腳本創(chuàng)建多個線程,但是子線程完全受主線程控制,且不得操作。所以,這個新標(biāo)準(zhǔn)并沒有改變單線程的本質(zhì)。事件循環(huán)主線程線程只會做一件事,就是從消息隊列里面取消息執(zhí)行消息,再取消息再執(zhí)行。工作線程是生產(chǎn)者,主線程是消費者。 最近項目中遇到了一個場景,其實很常見,就是定時獲取接口刷新數(shù)據(jù)。那么問題來了,假設(shè)我設(shè)置的定時時間為1s,而數(shù)據(jù)接口返回大于1s,應(yīng)該用同步阻塞還是異步?我們...

    elliott_hu 評論0 收藏0
  • setTimeout深入JavaScript執(zhí)行環(huán)境異步機制

    摘要:圖片轉(zhuǎn)引自的演講和兩個定時器中回調(diào)的執(zhí)行邏輯便是典型的機制。異步編程關(guān)于異步編程我的理解是,在執(zhí)行環(huán)境所提供的異步機制之上,在應(yīng)用編碼層面上實現(xiàn)整體流程控制的異步風(fēng)格。 問題背景 在一次開發(fā)任務(wù)中,需要實現(xiàn)如下一個餅狀圖動畫,基于canvas進(jìn)行繪圖,但由于對于JS運行環(huán)境中異步機制的不了解,所以遇到了一個棘手的問題,始終無法解決,之后在與同事交流之后才恍然大悟。問題的根節(jié)在于經(jīng)典的J...

    codeGoogle 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<