一、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