setTimeout() 和 setInterval()

JavaScript是單線程語言,但它容許經過設置超時值和間歇時間值來調度代碼在特定的時刻執行。前者是在指定的時間事後執行代碼,然後者是每隔指定的時間就執行一次代碼。函數

setTimeout 超時調用

超時調用須要使用window對象的setTimeout()方法,它接受兩個參數:要執行的代碼和以毫秒錶示的時間(即在執行代碼前須要等待多少秒)。第一個參數能夠是一個包含JavaScript代碼的字符串,也能夠是一個函數,可是因爲傳遞字符串可能致使性能損失,所以不建議以字符串做爲第一個參數。
下面是重點哦!!!!
第二個參數是一個表示等待多長時間的毫秒數,但通過該時間後指定的代碼不必定會執行。JavaScript是一個單線程的解釋器,所以必定時間內只能執行一段代碼。爲了控制要執行的代碼,就有一個JavaScript任務隊列。這些任務會按照將它們添加到隊列的順序執行。setTimeout()的第二個參數告訴JavaScript再過多長時間把當前任務添加到隊列中若是隊列是空的,那麼添加的代碼會當即執行;若是隊列不是空的,那麼它就要等前面的代碼執行完了後再執行。
調用setTimeout()以後,該方法會返回一直數值ID,表示超時調用。這個超時調用ID是計劃執行代碼的惟一標識符,能夠經過它來取消超時調用。要取消還沒有執行的超時調用計劃,能夠調用clearTimeout()方法並將相應的超市調用ID做爲參數傳遞給它。如:性能

// 設置超時調用
var timeoutId = setTimeout(function(){
    alert("Hello World!");
},100);
// 取消超時調用
clearTimeout(timeoutId);

只要在指定的時間還沒有過去以前調用clearTimeout(),就能夠徹底取消超時調用。前面的代碼在設置超時調用後立刻又調用了clearTimeout(),結果就跟什麼也沒有發生同樣。
注:超時調用的代碼都是在全局做用域中執行的,所以函數中this的值在非嚴格模式下指向window對象,嚴格模式下是undefined。this

setInterval 間歇調用

間歇調用與超時調用相似,只不過它會按照指定的時間間隔重複執行代碼,直至間歇調用被取消或者頁面被卸載。線程

小結

在使用超時調用時,沒有必要跟蹤超時調用ID,由於每次執行代碼以後,若是再也不設置另外一次超時調用,調用就會自行中止。通常認爲,使用超時調用來模擬間歇調用的是一種最佳模式。在開發環境下,不多使用真正的間歇調用,緣由是後一個間歇調用可能會在前一個間歇調用結束前啓動。
使用超時調用則能夠徹底避免這一點。以下:code

var num = 0;
var max = 10;

function incrementNumber () {
    num++;
    if (num < max) {
        setTimeout(incrementNumber,500);
    } else {
        alert("Done");
    }
}

setTimeout(incrementNumber,500);
相關文章
相關標籤/搜索