定時(shí)器:
JavaScript提供定時(shí)執(zhí)行代碼的功能捂寿,叫做定時(shí)器(timer)刹泄,主要由setTimeout()和setInterval()這兩個(gè)函數(shù)來完成
setTimeout()
setTimeout函數(shù)用來指定某個(gè)函數(shù)或某段代碼,在多少毫秒之后執(zhí)行。它返回一個(gè)整數(shù),表示定時(shí)器的編號(hào)慌植,以后可以用來取消這個(gè)定時(shí)器甚牲。
setTimeout(function (){console.log(2)},1000);
setInterval()
setInterval函數(shù)的用法與setTimeout完全一致,區(qū)別僅僅在于setInterval指定某個(gè)任務(wù)每隔一段時(shí)間就執(zhí)行一次蝶柿,也就是無限次的定時(shí)執(zhí)行丈钙。
var i = 1
var timer = setInterval(function() {
console.log(i++);
}, 1000);
clearTimeout(),clearInterval()
etTimeout和setInterval函數(shù)交汤,都返回一個(gè)表示計(jì)數(shù)器編號(hào)的整數(shù)值雏赦,將該整數(shù)傳入clearTimeout和clearInterval函數(shù),就可以取消對應(yīng)的定時(shí)器蜻展。
var id1 = setTimeout(f,1000);
var id2 = setInterval(f,1000);
clearTimeout(id1);
clearInterval(id2);
運(yùn)行機(jī)制
下面這段代碼輸出結(jié)果是? 為什么?
var a = 1;
setTimeout(function(){
a = 2;
console.log(a);//1
}, 0);
var a ;
console.log(a);//3
a = 3;
console.log(a);//2
定時(shí)器為異步任務(wù),先掛起邀摆,將代碼移出本次執(zhí)行纵顾,放入任務(wù)隊(duì)列,等到下一輪Event Loop時(shí)栋盹,再檢查是否到了指定時(shí)間施逾。如果到了,就執(zhí)行對應(yīng)的代碼例获;即必須等到本次執(zhí)行的所有代碼(同步任務(wù))都執(zhí)行完汉额,才會(huì)執(zhí)行setTimeout指定的代碼(任務(wù)隊(duì)列)
,先輸出10個(gè)1榨汤,再執(zhí)行定時(shí)器函數(shù)蠕搜,輸出hi;
setTimeout(()=>{console.log("hi")
},3000)
console.log(1)
console.log(1)
console.log(1)
console.log(1)
console.log(1)
console.log(1)
console.log(1)
console.log(1)
console.log(1)
console.log(1)
console.log(1)
收壕,先輸出1,3妓灌,再執(zhí)行定時(shí)器函數(shù),輸出2蜜宪;
var flag = true;
setTimeout(function(){
flag = false;
},0)
while(flag){}
console.log(flag);
一直輸出true虫埂;陷入死循環(huán);
定時(shí)器為異步任務(wù)圃验,先掛起掉伏,將代碼移出本次執(zhí)行,放入任務(wù)隊(duì)列澳窑,等到下一輪Event Loop時(shí)斧散,再檢查是否到了指定時(shí)間。如果到了摊聋,就執(zhí)行對應(yīng)的代碼颅湘;即必須等到本次執(zhí)行的所有代碼(同步任務(wù))都執(zhí)行完,才會(huì)執(zhí)行setTimeout指定的代碼(任務(wù)隊(duì)列)栗精,先執(zhí)行while語句闯参,flag為真瞻鹏,一直循環(huán)輸出true;
范例:
實(shí)現(xiàn)一個(gè)節(jié)流函數(shù)。
一定時(shí)間內(nèi)鹿寨,重復(fù)執(zhí)行同一函數(shù)新博,以最后一次為準(zhǔn)
function throttle(delay){
var timer=null;
return function(){
clearTimeout(timer);
timer=setTimeout(function(){
console.log("hello");
},delay);
};
}
var fn=throttle(10000);
fn();
fn();
fn();//hello
作者:彭榮輝
鏈接:http://www.reibang.com/u/0f804364a8a8
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)脚草,非商業(yè)轉(zhuǎn)載請注明出處赫悄。