[英]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.