javascript中,如何用setTimeout函數模擬實現setInterval函數?

talk is cheap:函數

var util = (function(){
    //定義intervalObj對象,用於保存intervalId映射到真實timeoutId
    var intervalObj = {}
    //每調用一次_setInterval就會自增1的一個intervalId
    var intervalId = 0

    var _setInterval = function(fn, interval){
        //這裏注意要使用局部變量保存intervalId哦,避免next函數內部直接引用intervalId,由於intervalId可能會再次變化
        var thisIntervalId = ++intervalId
        function next(){
            intervalObj[thisIntervalId] = setTimeout(function(){
                fn()
                next()
            }, interval)
        }
        next()
        return thisIntervalId
    }

    var _clearInterval = function(intervalId){
        clearTimeout(intervalObj[intervalId])
    }

    return {setInterval: _setInterval, clearInterval: _clearInterval}

})()

說明:使用時除了須要加上一個util對象作命名空間外(其實也是沒辦法哦,由於util.setInterval和util.clearInterval須要共享一個叫作intervalObj的映射表),其餘與直接調用原生setInterval,clearInterval無異this

舉個栗子?:code

//開始一個定時執行函數
var intervalId = util.setInterval(function(){
    console.log('a')
}, 1000)

//10秒以後,清除掉定時器
setTimeout(function(){
    //實際清除代碼
    util.clearInterval(intervalId)
}, 10000)

各路大神若是其餘解決方案,請必定要留言賜教,並收下個人膝蓋對象

相關文章
相關標籤/搜索