JavaScript定時器 setTimeout 和 setInterval 異同

setTimeout setInterval
描述 實現的是根據給定的時間間隔,每隔一段時間調用一次函數或執行一次代碼 實現的是根據給定的時間,在通過該時間以後只調用一次函數或執行一次代碼
語法 setTimeout (callback, delay, arg1, ..., argn) setInterval (callback, interval, arg1, ..., argn)
參數 callback 必需。要調用的函數或要執行的代碼串。(如果函數,則只須要寫函數名,能夠不加雙引號和括號)
delay / interval 必需。在執行代碼前需等待的毫秒數。
arg1, ..., argn 可選。給回調函數的傳參。
返回值 返回整型定時器id,也就是這個setTimeout/setInterval 的惟一標示符。
取消定時器 利用 clearTimeout(id) 取消
運行機制
性能 性能較優
穩定性 更穩定

var interval = 3 * 1000,
    count = 0;
function someOpration(){
    var startTime = new Date();
    console.log(startTime.toLocaleString() + " " + startTime.getMilliseconds());
    var sum = 0;
    for(let i=0; i < 2000000000; i++){
        sum += i;
    }
    var endTime = new Date();
    console.log(endTime.toLocaleString() + " " + endTime.getMilliseconds());
    var duration = endTime - startTime;
    console.log(duration);
}

setTimeout 鏈式調用面試

function slow1(){
    if(count < 5){
        someOpration();
        count = count + 1;
        setTimeout(slow1, interval);
    }
}
setTimeout(slow1, interval);

setInterval 實現函數

var interval = 3 * 1000,
    count = 0;
function slow2(){
    if(count < 5){
        someOpration();
        count = count + 1;
    } else {
        clearTimeout(timerId);
    }
}
var timerId = setInterval(slow2, interval)

圖片描述

setTimeout做用域相關經典面試題

for (var i = 1; i <= 2; i++) {
    setTimeout(function() { alert(i) }, 100);
}
// 3
// 3

爲每一個定時器處理函數建立不一樣的「i」變量副本。好比這樣

for (var i = 1; i <= 2; ++i){
  doSetTimeout(i);
}
function doSetTimeout(i) {
  setTimeout(function() { alert(i); }, 100);
}

可簡寫爲

for (var i = 1; i <= 2; i++) {
    setTimeout(function(j) { console.log(j) }, 100, i);
}
相關文章
相關標籤/搜索