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

淺談對于“不用setInterval,用setTimeout”的理解

 更新時間:2019年08月28日 09:33:37   作者:小利子  
這篇文章主要介紹了淺談對于“不用setInterval,用setTimeout”的理解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

JavaScript高級程序設(shè)計(第三版)(以下簡稱紅寶書)22.3高級定時器中詳細(xì)介紹了定時器setTimeout和setInterval,看完書后,深入理解了二者的區(qū)別,結(jié)合前輩們給我的建議“用setTimeout,不要用setInterval”,寫下此文,分析這個建議的合理性。
這兩個家伙看上去長得差不多,func是要執(zhí)行的函數(shù),interval是時間間隔。

setTimeout(func,interval)
setInterval(func,interval)

關(guān)于時間間隔,紅寶書中這么說:

設(shè)定一個 150ms 后執(zhí)行的定時器不代表到了 150ms 代碼就立刻執(zhí)行,它表示代碼會在 150ms 后被加入到隊列中。如果在這個時間點上,隊列中沒有其他東西,那么這段代碼就會被執(zhí)行。

對于這個時間間隔的理解非常重要!步入正題,為何不用setInterval,因為它可能會帶來兩個問題:

  • “丟幀”現(xiàn)象
  • 不同定時器的代碼的執(zhí)行間隔比預(yù)期小

一圖勝千言,如下圖所示,讓我們跟著時間線看看這樣的問題怎么發(fā)生的。假定一個場景,在click事件中設(shè)置了setInterval(func,500),假設(shè)click事件和定時器內(nèi)函數(shù)的執(zhí)行時間都是1s,為了方便陳述,我把不同時間觸發(fā)的func取了不同的名字,實際上接下來的func1=func2=func3=func。在0s處觸發(fā)click事件,click事件執(zhí)行,在0.2s處觸發(fā)定時器,0.7s處第一個函數(shù)func1加入到事件隊列,但由于JS引擎是單線程的,click事件還在執(zhí)行,所以func1等待著,等到1s處,click事件執(zhí)行完畢,fun1才開始執(zhí)行。按照定時器的時間間隔,1.2s處第二個函數(shù)func2加入到事件隊列,但此時fun1正在執(zhí)行,所以func2只能等待。0.5s后,也就是1.7s處,第三個函數(shù)func理應(yīng)加入事件隊列,但是JS引擎做了一個事情:

當(dāng)使用 set Interval()時,僅當(dāng)沒有該定時器的任何其他代碼實例時,才將定時器代碼添加到隊列中。

在1.7s處,func1在執(zhí)行,func2在隊列里等待執(zhí)行,func2就是該定時器的代碼實例,按照J(rèn)S引擎的處理,func3不會加入到事件隊列里,更別說執(zhí)行了,這就導(dǎo)致出現(xiàn)了“丟幀”現(xiàn)象。而在圖中也可以注意到,func1執(zhí)行完畢,線程空閑了,func2就可以執(zhí)行了,這就使得func1和func2之間的執(zhí)行沒有時間間隔,這跟我們所預(yù)期的500ms產(chǎn)生一次結(jié)果是不同的。

而如果使用鏈?zhǔn)絪etTimeout調(diào)用,每次函數(shù)執(zhí)行的時候都會創(chuàng)建一個新的定時器。第二個setTimeout()調(diào)用使用了 arguments.callee 來獲取對當(dāng)前執(zhí)行的函數(shù)的引用,并為其設(shè)置另外一個定時器。這樣做的好處是,在前一個定時器代碼執(zhí)行完之前,不會向隊列插入新的定時器代碼,確保不會有任何缺失的間隔。而且,它可以保證在下一次定時器代碼執(zhí)行之前,至少要等待指定的間隔,避免了連續(xù)的運行。代碼如下所示

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

用setTimeout方法的話,上面假設(shè)的場景就發(fā)生了改變,如下圖所示,在0s處觸發(fā)click事件,click事件執(zhí)行,在0.2s處觸發(fā)定時器,0.7s處第一個函數(shù)func1加入到事件隊列,click事件執(zhí)行了1s,在1s處func1執(zhí)行,2s處func1執(zhí)行結(jié)束,第二個setTimeout定時器才被觸發(fā),0.5s后將函數(shù)func2加入隊列,此時隊列為空,func2開始執(zhí)行,3.5s處func2執(zhí)行結(jié)束,又一個setTimeout定時器被觸發(fā),0.5s后將函數(shù)func3加入隊列,此時隊列為空,func3開始執(zhí)行。。。

通過上面這個場景,我們能知道當(dāng)需要用定時器來設(shè)置一個操作重復(fù)執(zhí)行,并且這個操作需要執(zhí)行一定的時間,記得用setTimeout,不用setInterval!

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 微信小程序?qū)崿F(xiàn)自定義拍攝組件

    微信小程序?qū)崿F(xiàn)自定義拍攝組件

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)自定義拍攝組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • js流動式效果顯示當(dāng)前系統(tǒng)時間

    js流動式效果顯示當(dāng)前系統(tǒng)時間

    這篇文章主要為大家詳細(xì)介紹了js實現(xiàn)流動式時間效果的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • js實現(xiàn)加載頁面就自動觸發(fā)超鏈接的示例

    js實現(xiàn)加載頁面就自動觸發(fā)超鏈接的示例

    下面小編就為大家?guī)硪黄猨s實現(xiàn)加載頁面就自動觸發(fā)超鏈接的示例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Javascript表達(dá)式中連續(xù)的 && 和 || 之賦值區(qū)別

    Javascript表達(dá)式中連續(xù)的 && 和 || 之賦值區(qū)別

    了區(qū)分賦值表達(dá)式中出現(xiàn)的連續(xù)的 ‘&&’和 ‘||’的不同的賦值含義,做了一個小測試.
    2010-10-10
  • uni-app設(shè)置緩存過期時間的操作方法

    uni-app設(shè)置緩存過期時間的操作方法

    uni-app 是一個使用 Vue.js 開發(fā)所有前端應(yīng)用的框架,開發(fā)者編寫一套代碼,可發(fā)布到iOS、Android、Web(響應(yīng)式)、以及各種小程序,本文給大家介紹了uni-app設(shè)置緩存過期時間的操作方法,需要的朋友可以參考下
    2024-12-12
  • JS實現(xiàn)一鍵復(fù)制

    JS實現(xiàn)一鍵復(fù)制

    這篇文章主要為大家詳細(xì)介紹了js實現(xiàn)點擊按鈕復(fù)制文本,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • JS高級技巧(簡潔版)

    JS高級技巧(簡潔版)

    由于在JS中,所有的函數(shù)都是對象,所以使用函數(shù)指針十分簡單,也是這些東西使JS函數(shù)有趣且強大,這里特分享一下
    2018-07-07
  • 使用JS實現(xiàn)圖片展示瀑布流效果的實例代碼

    使用JS實現(xiàn)圖片展示瀑布流效果的實例代碼

    下面小編就為大家?guī)硪黄褂肑S實現(xiàn)圖片展示瀑布流效果的實例代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • 詳解JavaScript中哪一種循環(huán)最快呢

    詳解JavaScript中哪一種循環(huán)最快呢

    這篇文章主要介紹了詳解JavaScript中哪一種循環(huán)最快呢,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • JavaScript中保留小數(shù)點后N位方法總結(jié)

    JavaScript中保留小數(shù)點后N位方法總結(jié)

    這篇文章主要為大家詳細(xì)介紹了JavaScript中保留小數(shù)點后N位的幾個常用方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-06-06

最新評論

阳山县| 思南县| 汕尾市| 新巴尔虎左旗| 彭山县| 怀仁县| 巴南区| 鹤山市| 仁怀市| 普定县| 宜丰县| 璧山县| 凭祥市| 威远县| 武宣县| 江阴市| 遵化市| 昌吉市| 师宗县| 旺苍县| 淄博市| 喀喇沁旗| 乌拉特中旗| 衡阳市| 宣城市| 密山市| 彩票| 西充县| 东城区| 利津县| 黔南| 定安县| 二连浩特市| 图木舒克市| 黎城县| 阿克苏市| 隆安县| 剑川县| 兴安盟| 雷波县| 曲阳县|