3 回答

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個(gè)贊
用途setTimeout():
var delayInMilliseconds = 1000; //1 second
setTimeout(function() {
//your code to be executed after 1 second
}, delayInMilliseconds);

TA貢獻(xiàn)1900條經(jīng)驗(yàn) 獲得超5個(gè)贊
javascript setTimeout和setInterval(other)中有兩種(最常用的)計(jì)時(shí)器函數(shù)類型
這兩種方法都具有相同的簽名。他們以回調(diào)函數(shù)和延遲時(shí)間為參數(shù)。
setTimeout在延遲之后僅執(zhí)行一次,而setInterval在每個(gè)延遲毫秒后繼續(xù)調(diào)用回調(diào)函數(shù)。
這兩種方法都返回一個(gè)整數(shù)標(biāo)識(shí)符,可用于在計(jì)時(shí)器到期之前清除它們。
clearTimeout和clearInterval這兩種方法采取從上面函數(shù)返回一個(gè)整數(shù)標(biāo)識(shí)符setTimeout和setInterval
例:
setTimeout
alert("before setTimeout");
setTimeout(function(){
alert("I am setTimeout");
},1000); //delay is in milliseconds
alert("after setTimeout");
如果運(yùn)行上面的代碼,您將看到它發(fā)出警報(bào)before setTimeout,然后after setTimeout最終I am setTimeout在1秒(1000毫秒)后發(fā)出警報(bào)
您可以從示例中注意到,setTimeout(...)異步是異步的,這意味著在等待下一個(gè)語(yǔ)句之前,它不會(huì)等待計(jì)時(shí)器過去alert("after setTimeout");
例:
setInterval
alert("before setInterval"); //called first
var tid = setInterval(function(){
//called 5 times each time after one second
//before getting cleared by below timeout.
alert("I am setInterval");
},1000); //delay is in milliseconds
alert("after setInterval"); //called second
setTimeout(function(){
clearInterval(tid); //clear above interval after 5 seconds
},5000);
如果運(yùn)行上面的代碼,您將看到它發(fā)出警報(bào)before setInterval,然后after setInterval最終I am setInterval 在1秒(1000毫秒)后發(fā)出5次警報(bào),因?yàn)閟etTimeout在5秒鐘后清除了計(jì)時(shí)器,否則每1秒鐘您將收到I am setInterval無限次警報(bào)。
瀏覽器內(nèi)部如何運(yùn)作?
我將簡(jiǎn)要解釋。
要了解您必須了解JavaScript中的事件隊(duì)列。在瀏覽器中實(shí)現(xiàn)了一個(gè)事件隊(duì)列。每當(dāng)js中觸發(fā)一個(gè)事件時(shí),所有這些事件(例如click等)都會(huì)添加到此隊(duì)列中。當(dāng)您的瀏覽器沒有什么要執(zhí)行時(shí),它將從隊(duì)列中獲取一個(gè)事件并逐一執(zhí)行它們。
現(xiàn)在,當(dāng)您調(diào)用setTimeout或setInterval您的回調(diào)在瀏覽器中注冊(cè)一個(gè)計(jì)時(shí)器,并在給定時(shí)間到期后將其添加到事件隊(duì)列中,并最終javascript從隊(duì)列中獲取事件并執(zhí)行該事件。
發(fā)生這種情況是因?yàn)閖avascript引擎是單線程的,并且它們一次只能執(zhí)行一件事。因此,他們無法執(zhí)行其他javascript并跟蹤您的計(jì)時(shí)器。這就是為什么這些計(jì)時(shí)器是在瀏覽器中注冊(cè)的(瀏覽器不是單線程的),并且它可以跟蹤計(jì)時(shí)器并在計(jì)時(shí)器到期后在隊(duì)列中添加事件。
setInterval僅在這種情況下,會(huì)發(fā)生同樣的情況,即在指定的時(shí)間間隔后將事件一次又一次地添加到隊(duì)列中,直到事件被清除或刷新瀏覽器頁(yè)面。
注意
傳遞給這些函數(shù)的delay參數(shù)是執(zhí)行回調(diào)的最短延遲時(shí)間。這是因?yàn)樵谟?jì)時(shí)器到期后,瀏覽器將事件添加到要由JavaScript引擎執(zhí)行的隊(duì)列中,但是回調(diào)的執(zhí)行取決于您事件在隊(duì)列中的位置,并且由于引擎是單線程的,因此它將在其中執(zhí)行所有事件。隊(duì)列一個(gè)接一個(gè)。
因此,當(dāng)您的其他代碼阻塞線程并且沒有給它時(shí)間來處理隊(duì)列中的內(nèi)容時(shí),回調(diào)可能需要比指定的延遲時(shí)間更多的時(shí)間來專門調(diào)用。
正如我提到的,javascript是單線程。因此,如果您長(zhǎng)時(shí)間阻塞線程。
像這樣的代碼
while(true) { //infinite loop
}
您的用戶可能會(huì)收到一條消息,指出頁(yè)面沒有響應(yīng)。
添加回答
舉報(bào)