2

如何使用thisinside ofsetIntervalsetTimeout调用?

我想像这样使用它:

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);
};

但我不知道如何为intervalsand做到这一点timeouts

4

2 回答 2

9

最简单的方法是保存this到本地。调用和回调self的上下文不会更改本地。相反,它将保持原始值setIntervalsetTimeoutthis

function myObj() {
  var self = this;
  this.func = function(args) {
    setTimeout(function() { 
      self.func(args);
    }, 1000);
  }
}
于 2012-07-06T17:08:02.407 回答
1

从理论上讲,您可以继续使用this无处不在并避免that等,self如下所示:

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

...或者...

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

...但是,这样做会在 Firefox 22+ 中导致以下错误:

NS_ERROR_XPC_BAD_OP_ON_WN_PROTO : WrappedNative 原型对象的非法操作


如果您使用的是 jQuery 1.4+,则可以通过使用jQuery.proxy()而不是call或来避免这种情况apply

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

在 this other answer更多细节,以及使用原生 ECMAScript 5Underscore.jsprototype.js的替代方案。

于 2013-12-02T12:12:25.817 回答