淺談setTimeout 與 setInterval
最新寫(xiě)代碼中時(shí),看到項(xiàng)目中有人用到了 setTimeout(fun,0),于是想總結(jié)一下。個(gè)人理解,如果有錯(cuò)誤的地方還請(qǐng)指出。THX
要想理解JavaScript的定時(shí)器是如何工作的,先要明白 JavaScript 引擎是單線程的。這個(gè)可以理解為 javascript 引擎是一個(gè)服務(wù)員,它有一個(gè)服務(wù)的隊(duì)列,所有的界面元素事件,定時(shí)觸發(fā)器回調(diào),異步請(qǐng)求回調(diào)都要在這個(gè)任務(wù)隊(duì)列里排隊(duì),等待處理。所有任務(wù)都是一個(gè)最小單位,不會(huì)中斷處理。這樣就可以理解 setTimeout(fun,0) 了,它并不是代表立即執(zhí)行該代碼,除非任務(wù)隊(duì)列為空(事實(shí)上,各個(gè)瀏覽器在實(shí)際執(zhí)行這個(gè)的時(shí)候也是有差異了,比較新的瀏覽器實(shí)際可能是在4ms;老版本的可能更長(zhǎng)一點(diǎn),16ms也是可能的)。而 setTimeout(fun,time) 的意思就是多少時(shí)間后將 fun 回調(diào)加到這個(gè)任務(wù)隊(duì)列中,也就是至少需要time時(shí)間才會(huì)執(zhí)行fun。
舉個(gè)例子:
setTimeout(function () { console.log(1); }, 0); var tem = 0; for (var i = 1; i < 1000000; i++) { tem += i; }; console.log(2);
顯示結(jié)果為
2
1
就是說(shuō),在執(zhí)行 setTimeout 時(shí),將 function 回調(diào)加入了任務(wù)隊(duì)列,但并沒(méi)有立即執(zhí)行,因?yàn)閖s引擎還在忙著處理當(dāng)前的js,而只在這段代碼段執(zhí)行完才去任務(wù)列表里取新的任務(wù),所以結(jié)果就是先顯示 2 后顯示 1。
setInterval(fun, time)方法是,每隔一定時(shí)間將fun添加到隊(duì)列中,那么問(wèn)題來(lái),如果fun執(zhí)行時(shí)間比 time 要長(zhǎng)的時(shí)候怎么辦?
看一段代碼
var num = 0; var time = setInterval(function () { var tem = 0; for (var i = 1; i < 99999999; i++) { tem += i; }; num ++; console.log(num); }, 100); setTimeout(function (){ clearInterval(time); }, 1000);
意思是每隔100ms執(zhí)行一段代碼,在1s中后清除這個(gè)定時(shí)器。但是結(jié)果呢?
顯示結(jié)果為
1
2
3
也就是說(shuō),事實(shí)上,并沒(méi)有執(zhí)行到那么多次數(shù)。也就是說(shuō)某些間隔會(huì)被跳過(guò),這也就存在多個(gè)代碼執(zhí)行的間隔可能會(huì)比預(yù)期的小。原來(lái)在將定時(shí)器代碼加入隊(duì)列的時(shí)候,如果該定時(shí)器的代碼實(shí)例存在時(shí),該次定時(shí)器代碼會(huì)被跳過(guò)。
引用一張圖片,就很好理解了。
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
- Js setInterval與setTimeout(定時(shí)執(zhí)行與循環(huán)執(zhí)行)的代碼(可以傳入?yún)?shù))
- setInterval和setTimeout停止的方法
- setTimeout和setInterval的區(qū)別你真的了解嗎?
- 關(guān)于setInterval、setTimeout在jQuery中的使用注意事項(xiàng)
- Jquery中使用setInterval和setTimeout的方法
- Js中setTimeout()和setInterval() 何時(shí)被調(diào)用執(zhí)行的用法
- JS中setInterval、setTimeout不能傳遞帶參數(shù)的函數(shù)的解決方案
- javascript setTimeout和setInterval計(jì)時(shí)的區(qū)別詳解
- setTimeout和setInterval的深入理解
- js中的setInterval和setTimeout使用實(shí)例
相關(guān)文章
在JS中最??吹角凶钊菀酌曰蟮恼Z(yǔ)法(轉(zhuǎn))
發(fā)現(xiàn)一篇JS中比較容易迷惑的語(yǔ)法的解釋,挺有用的,轉(zhuǎn)載下,與大家分享2010-10-10IE瀏覽器不支持getElementsByClassName的解決方法
這篇文章主要介紹了IE瀏覽器不支持getElementsByClassName的解決方法,本文的方法比較完美的解決了這個(gè)問(wèn)題,需要的朋友可以參考下2014-08-08javascript學(xué)習(xí)筆記(七)利用javascript來(lái)創(chuàng)建和存儲(chǔ)cookie
今天把javascript如何用來(lái)創(chuàng)建及存儲(chǔ)cookie復(fù)習(xí)了一下,其中的一點(diǎn)體會(huì)拿出來(lái)和大家討論,懇請(qǐng)高手指點(diǎn)一二。2011-04-04javascript內(nèi)置對(duì)象Math案例總結(jié)分析
今天總結(jié)一下javascript 內(nèi)置對(duì)象Math中的函數(shù)用法,順帶寫(xiě)一下常見(jiàn)的案例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03JavaScript DOM元素常見(jiàn)操作詳解【添加、刪除、修改等】
這篇文章主要介紹了JavaScript DOM元素常見(jiàn)操作,包括針對(duì)dom元素的添加、刪除、修改等相關(guān)操作實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2018-05-05JS動(dòng)態(tài)的把左邊列表添加到右邊的實(shí)現(xiàn)代碼(可上下移動(dòng))
在javascript前端開(kāi)發(fā)過(guò)程中經(jīng)常見(jiàn)到動(dòng)態(tài)的把左邊列表添加到右邊,基于js代碼怎么實(shí)現(xiàn)的呢?今天小編通過(guò)本文給大家介紹下js 左邊列表添加到右邊的實(shí)現(xiàn)方法,感興趣的朋友一起看看吧2016-11-11JS實(shí)現(xiàn)省市縣三級(jí)下拉聯(lián)動(dòng)
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)省市縣三級(jí)下拉聯(lián)動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04javascript加載xml 并解析各節(jié)點(diǎn)的值(實(shí)現(xiàn)方法)
下面小編就為大家?guī)?lái)一篇javascript加載xml 并解析各節(jié)點(diǎn)的值(實(shí)現(xiàn)方法)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10