繁体   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