1. 程式人生 > 實用技巧 >用 setTimeout 實現 setInterval

用 setTimeout 實現 setInterval

window.idarr = [0];
function _setInterval(fun, time) {
    var id = setTimeout(function() {
        _setInterval(fun, time);
        fun();
        clearTimeout(id);
    }, time);
    window.idarr.pop();
    window.idarr.push(id);
    return window.idarr;
}
function _clearInterval(id) {
    clearTimeout(id[0]);
}

因為 setInterval 是setTimeout 實現,所以 clearInterval 也要用 clearTimeout 實現。但是 setInetrval 應該返回的是一個數字,這裡就有點為難了,因為它必須返回的是正在執行的 setTimeout 函式的計時器編碼,沒辦法。我只能用陣列去儲存這個 id,因為 return window.idarr 返回的是記憶體地址,直接操作 idarr 陣列,自然就可以接收當前的計時器編碼。不知道有啥其他的好法子。

還有一個問題想不明白,為啥編碼沒有 “2” 呢?

window.idarr = [];
function _setInterval(fun, time) {
    var id = setTimeout(function() {
        _setInterval(fun, time);
        fun();
        clearTimeout(id);
    }, time);
    window.idarr.push(id);
    return window.idarr;
}

function _clearInterval(id) {
    clearTimeout(id.slice(-1)[0]);
}

var count = 0;
var timerId = _setInterval(function() {
    count++;
    console.log(timerId);
    if(count==10){
        _clearInterval(timerId);
    }
}, 1000);

執行結果:

為啥沒有 ”2“ 呢?