我正在努力成为一个好公民,并尽可能地远离全球范围。有没有办法访问不在全局范围内的setTimeout变量?
那么,在这个例子中,有人会如何取消'计时器'?
myObject.timedAction = (function(){
var timer;
return function(){
// do stuff
// then wait & repeat
timer = setTimeout(myObject.timedAction,1000);
};
})();
我已经尝试clearTimeout(myObject.timedAction.timer,1000);
(没有成功),也不确定还有什么可以尝试。
答案 0 :(得分:4)
除非您引用timer
,否则您不能这样做,因为您将其声明为范围中的变量。你可以这样做:
myObject.timedAction = (function(){
return function(){
// do stuff
// then wait & repeat
myObject.timedAction.timer = setTimeout(myObject.timedAction,1000);
};
})();
clearTimeout(myObject.timedAction.timer);
请注意,上面的代码只允许一个计时器。如果您需要引用多个计时器,则需要进行调整。
答案 1 :(得分:3)
重点是内部变量是私有的,外部世界无法访问。所以你必须改变一下你的方法:
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非常棒。
答案 2 :(得分:1)
将计时器句柄放在对象的属性中:
myObject.timedAction = function(){
// do stuff
// then wait & repeat
this.timer = window.setTimeout(function(){ myObject.timedAction(); },1000);
};
请注意,您应该在函数中包含来自计时器的调用,以便将其作为对象的方法而不是全局函数调用,否则您将无法使用{{1}访问对象}。
现在您可以使用以下方法停止计时器:
this