js 定時器 setTimeout setInterval

一、setTimeout

var timer;
      timer=setTimeout(fn,0);
      function fn(){
         //執(zhí)行代碼塊
         let i=0;
         while(i<1000){
            i++;
         }
         //--
         //清除上次的一次性定時器
         clearTimeout(timer);
         timer=null;
         //再添加一個新的定時器
         timer=setTimeout(fn,0);
         console.log(timer)//0 1 2 ...一直累加
      }

一開始我的疑問是, timer 這個變量 我明明在每次賦值之前清掉了上次的定時器,并且賦值為null了,為什么timer還是累加的呢?難道clearTimerout竟然沒有清掉定時器?

經(jīng)過研究,原來timer只是一個 number類型的id值,過程是這樣的,clearTimerout 清理掉了定時器1,然后創(chuàng)建了定時器2,清掉了2,創(chuàng)建了3,所以內(nèi)存中定時器并沒有累計很多,始終只是一個定時器在運行而已。所以是我多慮了。。。

二、setInterval

var timer;
      timer=setInterval(fn,10);
      function fn(){
         //執(zhí)行代碼塊
         let i=0;
         while(i<1000){
            i++;
         }
         //--
      }

一開始我的疑問是,加入我定時器的回調(diào)函數(shù)的執(zhí)行時間是50ms,而定時器執(zhí)行的間隔時間設(shè)置的10ms,那么是不是在我上次的回調(diào)函數(shù)還沒執(zhí)行完時候,下一次定時器就要執(zhí)行了,javascript是單線程的,然后程序會出問題。。

經(jīng)過研究,原來 如果下次的定時器需要執(zhí)行了,但這次的回調(diào)函數(shù)還在執(zhí)行,則定時器會被暫存到系統(tǒng)的執(zhí)行隊列中,等待執(zhí)行,等到這次的回調(diào)函數(shù)執(zhí)行完畢,則在隊列隊尾等待的定時器才會執(zhí)行,而且定時器的間隔時間也就無需在等待了,定時器立即執(zhí)行。

我沒有實驗,可以參考這篇文章 。轉(zhuǎn)載 http://www.itdecent.cn/p/0ad05e325f9b

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,621評論 1 32
  • OC語言基礎(chǔ) 1.類與對象 類方法 OC的類方法只有2種:靜態(tài)方法和實例方法兩種 在OC中,只要方法聲明在@int...
    奇異果好補(bǔ)閱讀 4,517評論 0 11
  • 高級定時器 關(guān)于定時器要記住的最重要的事情是:指定的時間間隔表示何時將定時器的代碼添加到隊列,而不是何時實際執(zhí)行代...
    源境閱讀 580評論 0 1
  • iOS中的定時器大致分為這幾類: NSTimer CADisplayLink GCD定時器 (一)NSTimer ...
    CreateTian閱讀 477評論 0 0
  • 接下來的事情就簡單了,在10年的高考中,望京不負(fù)眾望,以全縣第一名、高出一本分?jǐn)?shù)線60分的優(yōu)異成績被西京理工...
    大圣別走閱讀 470評論 0 1

友情鏈接更多精彩內(nèi)容