JS定時(shí)器

定時(shí)器主要由setTimeout()和setInterval()這兩個(gè)函數(shù)完成座咆。

1.setTimeout()函數(shù)用來(lái)指定某個(gè)函數(shù)或某段代碼,在多少毫秒之后執(zhí)行。它返回一個(gè)整數(shù)蛔翅,表示定時(shí)器的編號(hào)瓶殃,以后可以用來(lái)取消這個(gè)定時(shí)器充包。
syntax:
<pre>
var timerId=setTimeout(func|code,delay)
</pre>

示例:
<pre>
function showTime(){
console.log(1);
}
setTimeout(showTime(),1000);//輸出結(jié)果為1
</pre>

注意:為了便于JavaScript引擎優(yōu)化代碼,setTimeout方法一般總是采用函數(shù)名的形式遥椿。

2.setInterval()
setInterval()函數(shù)的用法與setTimeout完全一致基矮,區(qū)別僅僅在于setInterval指定某個(gè)任務(wù)每隔一段時(shí)間就執(zhí)行一次,也就是無(wú)限次的定時(shí)執(zhí)行冠场。
示例:
<pre>
var timer=setInterval(function(){
console.log(2);
},1000);
</pre>

setInterval指定的是“開始執(zhí)行”之間的間隔家浇,并不考慮每次任務(wù)執(zhí)行本身消耗所消耗的時(shí)間。因此實(shí)際上碴裙,兩次執(zhí)行之間的間隔會(huì)小于指定的時(shí)間钢悲。比如,setInterval指定每100ms執(zhí)行一次舔株,每執(zhí)行需要5ms,那么第一次執(zhí)行結(jié)束后95毫秒莺琳,第二次執(zhí)行就會(huì)開始。如果某次執(zhí)行耗時(shí)特別長(zhǎng)载慈,比如需要105毫秒惭等,那么它結(jié)束后,下一次執(zhí)行就會(huì)立即開始办铡。
為確保兩次執(zhí)行之間有固定的時(shí)間間隔辞做,可以不用setInterval,而是每次執(zhí)行結(jié)束之后寡具,使用setTimeout指定下一次執(zhí)行的具體時(shí)間凭豪。
示例:
<pre>
var i=1;
var timer=setTimeout(function(){
alert(i++);
timer=setTimeout(arguments.callee,2000);
},2000);
</pre>

setTimeout和setInterval的運(yùn)行機(jī)制是,將指定的代碼移出本次執(zhí)行晒杈,等到下一輪Event Loop時(shí)嫂伞,再檢查是否到了指定時(shí)間。如果到了拯钻,就執(zhí)行對(duì)應(yīng)的代碼帖努;如果不到,就等到了再下一輪Event Loop時(shí)重新判斷粪般。這意味著拼余,setTimeout指定的代碼,必須等到本次執(zhí)行的所有代碼都執(zhí)行完亩歹,才會(huì)執(zhí)行匙监。

每一輪EventLoop時(shí)凡橱,都會(huì)將“任務(wù)隊(duì)列”中需要執(zhí)行的任務(wù),一次執(zhí)行完亭姥。setTimeout和setInterval都是把任務(wù)添加到“任務(wù)隊(duì)列”的尾部稼钩。因此,它們實(shí)際上要等到當(dāng)前腳本的所有同步任務(wù)執(zhí)行完达罗,然后再等到本次Event Loop的“任務(wù)隊(duì)列”的所有任務(wù)執(zhí)行完坝撑,才會(huì)開始執(zhí)行。由于前面的任務(wù)到底需要多少時(shí)間執(zhí)行完,是不確定的,所以沒辦法保證锥涕,setTimeout和setInterval指定的任務(wù),一定會(huì)按照預(yù)定時(shí)間執(zhí)行侨拦。

一直有一個(gè)疑問,如果setInterval里面的函數(shù)的執(zhí)行時(shí)間大于設(shè)定的時(shí)間間隔會(huì)怎么樣呢辐宾?
<pre>
setInterval(function(){
console.log(2);
},1000);

(function(){
sleepling(3000);
})();
</pre>

上面的第一行語(yǔ)句要求每隔1000毫秒阳谍,就輸出一個(gè)2。但是螃概,第二行語(yǔ)句需要3000毫秒才能完成,這樣會(huì)發(fā)生的結(jié)果是:等到第二行語(yǔ)句運(yùn)行完成以后鸽疾,立刻連續(xù)輸出三個(gè)2吊洼,然后開始每隔1000毫秒,輸出一個(gè)2制肮。也就是說冒窍,setIntervel具有累積效應(yīng),如果某個(gè)操作特別耗時(shí)豺鼻,超過了setInterval的時(shí)間間隔综液,排在后面的操作會(huì)被累積起來(lái),然后在很短的時(shí)間內(nèi)連續(xù)觸發(fā)儒飒,這可能或造成性能問題谬莹。

參考文章:定時(shí)器

版權(quán)歸王麗峰和饑人谷所有,若有轉(zhuǎn)載桩了,請(qǐng)注明來(lái)源附帽。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市井誉,隨后出現(xiàn)的幾起案子蕉扮,更是在濱河造成了極大的恐慌,老刑警劉巖颗圣,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喳钟,死亡現(xiàn)場(chǎng)離奇詭異屁使,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)奔则,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蛮寂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人应狱,你說我怎么就攤上這事共郭。” “怎么了疾呻?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵除嘹,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我岸蜗,道長(zhǎng)尉咕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任璃岳,我火速辦了婚禮年缎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铃慷。我一直安慰自己单芜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布犁柜。 她就那樣靜靜地躺著洲鸠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪馋缅。 梳的紋絲不亂的頭發(fā)上扒腕,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音萤悴,去河邊找鬼瘾腰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛覆履,可吹牛的內(nèi)容都是我干的蹋盆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼硝全,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼怪嫌!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起柳沙,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤岩灭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后赂鲤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體噪径,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡柱恤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了找爱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梗顺。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖车摄,靈堂內(nèi)的尸體忽然破棺而出寺谤,到底是詐尸還是另有隱情,我是刑警寧澤吮播,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布变屁,位于F島的核電站,受9級(jí)特大地震影響意狠,放射性物質(zhì)發(fā)生泄漏粟关。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一环戈、第九天 我趴在偏房一處隱蔽的房頂上張望闷板。 院中可真熱鬧,春花似錦院塞、人聲如沸遮晚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)县遣。三九已至,卻和暖如春创泄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背括蝠。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工鞠抑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人忌警。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓搁拙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親法绵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子箕速,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 從JS執(zhí)行機(jī)制說起 瀏覽器(或者說JS引擎)執(zhí)行JS的機(jī)制是基于事件循環(huán)。 由于JS是單線程朋譬,所以同一時(shí)間只能執(zhí)行...
    love2013閱讀 876評(píng)論 0 1
  • 前言:在引用開發(fā)中盐茎,我們經(jīng)常需要在頁(yè)面中執(zhí)行一些周期性的操作,比如每隔一段時(shí)間就執(zhí)行某一固定的操作徙赢。而對(duì)于這樣的操...
    帥帥噠小白閱讀 5,332評(píng)論 1 3
  • 定時(shí)器 JavaScript提供定時(shí)執(zhí)行代碼的功能字柠,叫做定時(shí)器(timer)探越,主要由setTimeout()和se...
    李諾哦閱讀 1,019評(píng)論 0 0
  • 1. if name == 'main' 作用 簡(jiǎn)單來(lái)說,就是這個(gè)語(yǔ)句只有在這個(gè)文件自己被執(zhí)行的時(shí)候才會(huì)true執(zhí)...
    JaiUnChat閱讀 196評(píng)論 0 0
  • 11月窑业,廣州依然繁花葉茂钦幔! 來(lái)個(gè)禪繞花園也不錯(cuò)! 慕卡常柄,一直很喜歡的禪繞圖樣鲤氢!多個(gè)變化組合一起,也不覺得雜亂西潘,真是...
    芯之禪繞閱讀 440評(píng)論 0 4