最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

setTimeout和setInterval的深入理解

 更新時間:2013年11月08日 17:31:27   作者:  
以前寫的setTimeout和setInterval的文章有些不足之處,今天抽時間整理了一下,要想真正理解還得從javascript的單線程機制說起
大概半年前發(fā)表過一篇關(guān)于setTimeout和setInterval的文章,但是現(xiàn)在回去仔細(xì)一看發(fā)現(xiàn)其實存在很多不足以及錯誤。事實上,setTimeout和setInterval并沒有我們字面上理解的那么簡單。要真正掌握并理解這兩個方法,還得從javascript的單線程機制說起。

【開門見山】setTimeout和setInterval是如何工作的呢?
我們知道,js是單線程執(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ù):
復(fù)制代碼 代碼如下:

function fn() {
/*
here is some codes
*/
setTimeout(function() {alert('ok!')},1000);
}

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

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

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

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

相關(guān)文章

  • javascript基礎(chǔ)的動畫教程,直觀易懂

    javascript基礎(chǔ)的動畫教程,直觀易懂

    javascript基礎(chǔ)的動畫教程,直觀易懂...
    2007-01-01
  • javascript判斷office版本示例

    javascript判斷office版本示例

    這篇文章主要介紹了javascript判斷office版本示例,需要的朋友可以參考下
    2014-04-04
  • JavaScript學(xué)習(xí)心得之概述

    JavaScript學(xué)習(xí)心得之概述

    本文主要介紹了javascript的一些基礎(chǔ)性的東西,包括javascript簡介,及<script>元素的介紹等,并通過示例讓大家更好的理解javascript,非常不錯,推薦給大家。
    2015-01-01
  • JavaScript中的typeof操作符用法實例

    JavaScript中的typeof操作符用法實例

    在Web前端開發(fā)中,我們經(jīng)常需要判斷變量的數(shù)據(jù)類型。鑒于ECMAScript是松散類型的,因此需要有一種手段來檢測給定變量的數(shù)據(jù)類型——typeof就是負(fù)責(zé)提供這方便信息的操作符。
    2014-04-04
  • 如何用JavaScript定義一個類

    如何用JavaScript定義一個類

    其實Javascript中沒有類這個定義,但是有類這個概念。很多人都寫過這樣的代碼,就是一個關(guān)鍵字 function,然后定義一個方法名,方法名后緊跟一對括號。如果你在項目中寫過這樣的代碼,那么祝賀你,你可以不費任何吹毛之力,就能一口氣讀完這篇文章了。
    2014-09-09
  • javascript內(nèi)存管理詳細(xì)解析

    javascript內(nèi)存管理詳細(xì)解析

    本文是對javascript中的內(nèi)存管理進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-11-11
  • JS的Document屬性和方法小結(jié)

    JS的Document屬性和方法小結(jié)

    Document想必大家并不陌生吧,在使用js的過程中會經(jīng)常遇到它,那么它有哪些屬性、哪些方法,在本文將以示例為大家詳細(xì)介紹下,希望對大家有所幫助
    2013-09-09
  • 淺析JS操作DOM的一些常用方法

    淺析JS操作DOM的一些常用方法

    下面小編就為大家?guī)硪黄狫S操作DOM的一些常用方法。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • javascript實現(xiàn)playfair和hill密碼算法

    javascript實現(xiàn)playfair和hill密碼算法

    這篇文章主要介紹了javascript實現(xiàn)playfair和hill密碼算法,需要的朋友可以參考下
    2014-12-12
  • JavaScript中l(wèi)et避免閉包造成問題

    JavaScript中l(wèi)et避免閉包造成問題

    這篇文章主要介紹了JavaScript中l(wèi)et避免閉包造成問題,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評論

鸡泽县| 乐清市| 平昌县| 莲花县| 平山县| 万源市| 白沙| 广丰县| 灵丘县| 德昌县| 手机| 兴国县| 娄底市| 宜宾市| 湛江市| 衡阳县| 兖州市| 福贡县| 通江县| 重庆市| 元江| 安多县| 德保县| 昌邑市| 陈巴尔虎旗| 宿松县| 射阳县| 乌拉特前旗| 翁牛特旗| 陵水| 大埔县| 饶阳县| 项城市| 且末县| 绩溪县| 任丘市| 东阿县| 玛曲县| 鄂托克前旗| 仪陇县| 化隆|