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

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

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

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

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

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

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

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

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

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

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

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

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


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

相關(guān)文章

  • BootStrap智能表單實(shí)戰(zhàn)系列(七)驗(yàn)證的支持

    BootStrap智能表單實(shí)戰(zhàn)系列(七)驗(yàn)證的支持

    這篇文章主要介紹了BootStrap智能表單實(shí)戰(zhàn)系列(七)驗(yàn)證的支持 ,凡是涉及到用戶編輯信息然后保存的頁面,都涉及到一個(gè)數(shù)據(jù)是否符合要求的檢查,需要客服端和服務(wù)器端的校驗(yàn)的問題,本文介紹非常詳細(xì),具有參考價(jià)值,需要的朋友可以參考下
    2016-06-06
  • JS使用Date對象實(shí)時(shí)顯示當(dāng)前系統(tǒng)時(shí)間簡單示例

    JS使用Date對象實(shí)時(shí)顯示當(dāng)前系統(tǒng)時(shí)間簡單示例

    這篇文章主要介紹了JS使用Date對象實(shí)時(shí)顯示當(dāng)前系統(tǒng)時(shí)間,涉及javascript基于定時(shí)器動(dòng)態(tài)操作Date對象相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-08-08
  • 仿谷歌主頁js動(dòng)畫效果實(shí)現(xiàn)代碼

    仿谷歌主頁js動(dòng)畫效果實(shí)現(xiàn)代碼

    昨天看到谷歌的主頁上出現(xiàn)了幾個(gè)動(dòng)畫,發(fā)現(xiàn)不是flash做的,而是用js+圖片實(shí)現(xiàn)的!今天把拷貝到的圖片,用js實(shí)現(xiàn)了動(dòng)畫效果!
    2013-07-07
  • javascript使用中為什么10..toString()正常而10.toString()出錯(cuò)呢

    javascript使用中為什么10..toString()正常而10.toString()出錯(cuò)呢

    在JavaScript中為什么10..toString()正常,而10.toString()出錯(cuò)呢?這個(gè)問題一直困擾著我,所抽時(shí)間搜集整理下,曬出來與大家分享感興趣的朋友可以了解下,希望對你們有幫助
    2013-01-01
  • javascript實(shí)現(xiàn)簡易計(jì)算器的代碼

    javascript實(shí)現(xiàn)簡易計(jì)算器的代碼

    下面小編就為大家?guī)硪黄猨avascript實(shí)現(xiàn)簡易計(jì)算器的代碼小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-05-05
  • 微信小程序提取公用函數(shù)到util.js及使用方法示例

    微信小程序提取公用函數(shù)到util.js及使用方法示例

    這篇文章主要介紹了微信小程序提取公用函數(shù)到util.js及使用方法,結(jié)合實(shí)例形式分析了util.js公用函數(shù)相關(guān)調(diào)用操作技巧,需要的朋友可以參考下
    2019-01-01
  • JS繪圖Flot如何實(shí)現(xiàn)動(dòng)態(tài)可刷新曲線圖

    JS繪圖Flot如何實(shí)現(xiàn)動(dòng)態(tài)可刷新曲線圖

    這篇文章主要介紹了JS繪圖Flot如何實(shí)現(xiàn)動(dòng)態(tài)可刷新曲線圖,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 圖片onload事件觸發(fā)問題解決方法

    圖片onload事件觸發(fā)問題解決方法

    當(dāng)頁面上存在一個(gè)圖片元素時(shí)如:<img src='xxxx' alt="" />,頁面加載中ie7、8跟chrome下圖片的onload事件非常奇怪,有后完全不觸發(fā),有時(shí)候觸發(fā)后進(jìn)行改變某些元素的操作,操作結(jié)果無效。
    2011-07-07
  • JS處理下劃線的方法步驟

    JS處理下劃線的方法步驟

    本文主要介紹了使用JavaScript處理下劃線,特別是在雙引號(hào)內(nèi)的下劃線不作為分隔符的情況,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • javascript中檢測變量的類型的代碼

    javascript中檢測變量的類型的代碼

    javascript對于變量的定義、類型的要求都比較松散,這樣既方便,但又容易犯錯(cuò)。有時(shí)候進(jìn)行必要的類型檢查是必須的。
    2010-12-12

最新評論

从江县| 慈利县| 信阳市| 玛纳斯县| 连江县| 广饶县| 西畴县| 阿巴嘎旗| 延庆县| 周至县| 武山县| 扶风县| 宣恩县| 启东市| 麦盖提县| 西林县| 英山县| 东城区| 和政县| 滁州市| 体育| 阜新市| 开阳县| 佛冈县| 巩义市| 灵丘县| 望城县| 墨竹工卡县| 息烽县| 壶关县| 安乡县| 兰州市| 桦川县| 上蔡县| 沙雅县| 芜湖县| 慈利县| 仁化县| 卓尼县| 景谷| 石城县|