用 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“ 呢?

原文地址:https://www.cnblogs.com/arduka/p/13337018.html