2012-07-06 62 views
2

如何在setIntervalsetTimeout調用中使用this如何在setInterval和setTimeout函數中更改「this」的範圍

我想用它喜歡:

function myObj() { 
    this.func = function(args) { 
    setTimeout(function() { 
     this.func(args); 
    }, 1000); 
    } 
} 

前一段時間我是做.onclick事件是這樣的:

this.click = function(func) { 
    this.elem.onclick = (function(func, obj) {return function(){func.apply(obj)} })(func,this); 
}; 

,但我不知道我怎麼能爲intervals做和timeouts

+0

確定您首先搜索? – 2012-07-06 17:09:45

回答

9

最簡單的方法是將this保存到本地。本地self不會被調用setIntervalsetTimeout回調的上下文更改。這反而保持原有this

function myObj() { 
    var self = this; 
    this.func = function(args) { 
    setTimeout(function() { 
     self.func(args); 
    }, 1000); 
    } 
} 
1

理論上,你可以做繼續使用this無處不在,並避免thatself等這樣的:

setTimeout.call(this, function() { 
    this.func(args); 
}, 1000); 

...或...

setTimeout.apply(this, [function() { 
    this.func(args); 
}, 1000]); 

... 但是,這樣做會導致在Firefox以下error 22+:

NS_ERROR_XPC_BAD_OP_ON_WN_PROTO:上WrappedNative原型對象非法操作


如果你正在使用jQuery 1.4+,你能避免這種通過使用jQuery.proxy()代替callapply

setTimeout($.proxy(function() { 
    this.func(args); 
}, this), 50); 

有一些more detail, and alternatives using native ECMAScript 5, Underscore.js and prototype.js at this other answer

相關問題