Javascript:如何清除非全局(闭合)设置超时
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);
相关文章:
- 全局变量和全局对象的属性之间有什么区别吗
- 正在全局范围中查找JavaScript函数
- delete关键字在全局变量上的不同行为
- 在javascript函数中设置全局变量
- 如何将getJson的响应保存在全局变量中
- 全局对象是属于哪个类的对象
- Javascript全局onclick监听器
- 从Javascript方法返回全局变量
- 访问jsrender模板中的全局javascript变量并更新它
- javascript无法重新定义函数内部的全局对象
- javascript 中的全局函数
- cordova:例外:财产'requestFileSystem'的[对象全局]不是函数
- 全局安装gull后出错
- AngularJS中的封装窗口全局变量
- 全局标志仅与第一个匹配项匹配的Regexp
- javascript隐式全局变量
- Javascript-在哪里放置常量,全局或本地
- 如何从onclick函数设置全局变量并将其传递给另一个JS文件
- 角度控制器全局与闭合
- Javascript:如何清除非全局(闭合)设置超时