簡體   English   中英

Javascript:如何清除非全局(關閉)的setTimeout?

[英]Javascript: How to clear a non-global (closured) setTimeout?

我想成為一個好公民,並盡可能地遠離全球范圍。 有沒有辦法訪問不在全局范圍內的setTimeout變量?

那么,在這個例子中,有人會如何取消'計時器'?

myObject.timedAction = (function(){
    var timer;
        return function(){
            // do stuff

            // then wait & repeat       
            timer = setTimeout(myObject.timedAction,1000);
        };
})();

我試過clearTimeout(myObject.timedAction.timer,1000); (沒有成功),不知道還有什么可以嘗試。

除非你有timer的引用,否則你不能這樣做,因為你將它聲明為作用域中的變量。 你可以這樣做:

myObject.timedAction = (function(){
    return function(){
        // do stuff

        // then wait & repeat       
        myObject.timedAction.timer = setTimeout(myObject.timedAction,1000);
    };
})();

clearTimeout(myObject.timedAction.timer);

請注意,上面的代碼只允許一個計時器。 如果需要引用多個計時器,則需要進行調整。

重點是內部變量是私有的,外部世界無法訪問。 所以你必須改變一下你的方法:

myObject.timedAction = (function(){
    var timer;
    var result = function(){
        // do stuff
        // then wait & repeat       
        timer = setTimeout(myObject.timedAction,1000);
    };

    result.cancel = function() {
        clearTimeout(timer);
    };

    return result;
})();

myObject.timedAction();       // start it
myObject.timedAction.cancel() // end it

所以現在只能從閉包內部訪問計時器。 是的,您可以向函數添加方法,因為JS非常棒。

將計時器句柄放在對象的屬性中:

myObject.timedAction = function(){
  // do stuff
  // then wait & repeat
  this.timer = window.setTimeout(function(){ myObject.timedAction(); },1000);
};

請注意,您應該在函數中包含來自計時器的調用,以便將其作為對象的方法而不是全局函數調用,否則您將無法使用this訪問對象。

現在您可以使用以下命令停止計時器

window.clearTimeout(myObject.timer);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM