欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

setTimeout和setInterval的區(qū)別你真的了解嗎?

 更新時間:2011年03月31日 00:28:01   作者:  
setTimeout和setInterval這兩個函數(shù), 大家肯定都不陌生, 但可能并不是每個用過這兩個方法的同學(xué), 都了解其內(nèi)部的實質(zhì)
甚至可能會錯誤的把兩個實現(xiàn)定時調(diào)用的函數(shù)理解成了類似thread一樣的東西, 認(rèn)為會在一個時間片內(nèi), 并發(fā)的執(zhí)行調(diào)用的函數(shù), 似乎很好很強(qiáng)大, 但其實并不是如此, 實際的情況是javascript都是以單線程的方式運(yùn)行于瀏覽器的javascript引擎中的, setTimeout和setInterval的作用只是把你要執(zhí)行的代碼在你設(shè)定的一個時間點插入js引擎維護(hù)的一個代碼隊列中, 插入代碼隊列并不意味著你的代碼就會立馬執(zhí)行的,理解這一點很重要. 而且setTimeout和setInterval還有點不一樣.

先談?wù)剆etTimeout
復(fù)制代碼 代碼如下:

function click() {
// code block1...
setTimeout(function() {
// process ...
}, 200);
// code block2
}

假設(shè)我們給一個button的onclick事件綁定了此方法, 當(dāng)我們按下按鈕后, 肯定先執(zhí)行block1的內(nèi)容, 然后運(yùn)行到setTimeout的地方, setTimeout會告訴瀏覽器說, "200ms后我會插一段要執(zhí)行的代碼給你的隊列中", 瀏覽器當(dāng)然答應(yīng)了(注意插入代碼并不意味著立馬執(zhí)行), setTimeout代碼運(yùn)行后, 緊跟其后的block2代碼開始執(zhí)行, 這里就開始說明問題了, 如果block2的代碼執(zhí)行時間超過200ms, 那結(jié)果會是如何? 或許按照你之前的理解, 會理所當(dāng)然的認(rèn)為200ms一到, 你的process代碼會立馬執(zhí)行...事實是, 在block2執(zhí)行過程中(執(zhí)行了200ms后)process代碼被插入代碼隊列, 但一直要等click方法執(zhí)行結(jié)束, 才會執(zhí)行process代碼段, 從代碼隊列上看process代碼是在click后面的, 再加上js以單線程方式執(zhí)行, 所以應(yīng)該不難理解. 如果是另一種情況, block2代碼執(zhí)行的時間<200ms, setTimeout在200ms后將process代碼插入到代碼隊列, 而那時執(zhí)行線程可能已經(jīng)處于空閑狀態(tài)了(idle), 那結(jié)果就是200ms后, process代碼插入隊列就立馬執(zhí)行了, 就讓你感覺200ms后, 就執(zhí)行了.
再看看setInterval
這里可能會存在兩個問題:
1.時間間隔或許會跳過
2.時間間隔可能<定時調(diào)用的代碼的執(zhí)行時間
復(fù)制代碼 代碼如下:

function click() {
// code block1...
setInterval(function() {
// process ...
}, 200);
// code block2
}

和上面一樣我們假設(shè)通過一個click, 觸發(fā)了setInterval以實現(xiàn)每隔一個時間段執(zhí)行process代碼

比如onclick要300ms執(zhí)行完, block1代碼執(zhí)行完, 在5ms時執(zhí)行setInterval, 以此為一個時間點, 在205ms時插入process代碼, click代碼順利結(jié)束, process代碼開始執(zhí)行(相當(dāng)于圖中的timer code), 然而process代碼也執(zhí)行了一個比較長的時間, 超過了接下來一個插入時間點405ms, 這樣代碼隊列后又插入了一份process代碼, process繼續(xù)執(zhí)行著, 而且超過了605ms這個插入時間點, 下面問題來, 可能你還會認(rèn)為代碼隊列后面又會繼續(xù)插入一份process代碼...真實的情況是,由于代碼隊列中已經(jīng)有了一份未執(zhí)行的process代碼, 所以605ms這個插入時間點將會被"無情"的跳過, 因為js引擎只允許有一份未執(zhí)行的process代碼, 說到這里不知道您是不是會豁然開朗呢...

為了這種情況你可以用一種更好的代碼形式

復(fù)制代碼 代碼如下:

setTimeout(function(){
//processing
setTimeout(arguments.callee, interval);
}, interval);

這個估計稍微想一下, 就明白其中的好處了, 這樣就不會產(chǎn)生時間點被跳過的問題內(nèi)容就到這里, 希望能有所幫助, 可能我表達(dá)的不是很清楚如果覺得自己英語基礎(chǔ)不錯可以直接看


里有關(guān)advanced Timers這節(jié)內(nèi)容,  個人認(rèn)為這本書真的很不錯, 無論是想從零學(xué)起, 還是平日沒事翻翻參考參考 都很不錯, 作者是yahoo里很牛的一位前端開發(fā)工程師 : )

相關(guān)文章

  • JS中去掉array中重復(fù)元素的方法

    JS中去掉array中重復(fù)元素的方法

    這篇文章主要介紹了JS中去掉array中重復(fù)元素的方法,需要的朋友可以參考下
    2017-05-05
  • 淺談PDF.js使用心得

    淺談PDF.js使用心得

    本篇文章主要介紹了淺談PDF.js使用心得,pdf.js 是一個技術(shù)原型主要用于在 HTML5 平臺上展示 PDF 文檔,無需任何本地技術(shù)支持。非常具有實用價值,需要的朋友可以參考下
    2018-06-06
  • 基于JavaScript實現(xiàn)帶數(shù)據(jù)驗證和復(fù)選框的表單提交

    基于JavaScript實現(xiàn)帶數(shù)據(jù)驗證和復(fù)選框的表單提交

    這篇文章主要介紹了基于JavaScript實現(xiàn)帶數(shù)據(jù)驗證和復(fù)選框的表單提交功能,需要的朋友可以參考下
    2017-08-08
  • JS字符串累加Array不一定比字符串累加快(根據(jù)電腦配置)

    JS字符串累加Array不一定比字符串累加快(根據(jù)電腦配置)

    言歸正傳:性能差異較大的機(jī)器運(yùn)行結(jié)果會RT 出現(xiàn)大的差異,為了保險起見。還是推薦使用Array 來進(jìn)行字符串拼接操作
    2012-05-05
  • 微信小程序修改checkbox的樣式代碼實例

    微信小程序修改checkbox的樣式代碼實例

    這篇文章主要介紹了微信小程序修改checkbox的樣式代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • Js 獲取HTML DOM節(jié)點元素的方法小結(jié)

    Js 獲取HTML DOM節(jié)點元素的方法小結(jié)

    在Web應(yīng)用程序特別是Web2.0程序開發(fā)中,經(jīng)常要獲取頁面中某個元素,然后更新該元素的樣式、內(nèi)容等。
    2009-04-04
  • JavaScript入門基礎(chǔ)

    JavaScript入門基礎(chǔ)

    在學(xué)習(xí)JavaScript之前,必須具備HTML和CSS知識,Javascript是一種解釋性的,基于對象的腳本語言(aninterpreted,object-basedscriptinglanguage)。這篇文章主要講解JavaScript入門基礎(chǔ),需要的朋友可以參考下
    2015-08-08
  • 關(guān)于導(dǎo)入excel時js轉(zhuǎn)換時間的正確方式

    關(guān)于導(dǎo)入excel時js轉(zhuǎn)換時間的正確方式

    這篇文章主要給大家介紹了關(guān)于導(dǎo)入excel時js轉(zhuǎn)換時間的正確方式,以及js讀取excel中日期格式轉(zhuǎn)換問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • 詳解javascript高級定時器

    詳解javascript高級定時器

    這篇文章主要介紹了javascript高級定時器,針對javascript的代碼隊列進(jìn)行詳細(xì)解析,感興趣的小伙伴們可以參考一下
    2015-12-12
  • js判斷瀏覽器是否支持嚴(yán)格模式的方法

    js判斷瀏覽器是否支持嚴(yán)格模式的方法

    除了正常運(yùn)行模式,ECMAscript 5添加了第二種運(yùn)行模式:"嚴(yán)格模式"(strict mode)。顧名思義,這種模式使得Javascript在更嚴(yán)格的條件下運(yùn)行。這篇文章給大家詳細(xì)介紹了js判斷瀏覽器是否支持嚴(yán)格模式的方法,有需要的朋友們可以參考借鑒。
    2016-10-10

最新評論