繁体   English   中英

如何在setInterval和setTimeout函数中更改“this”的范围

[英]How do I change scope of “this” in setInterval and setTimeout functions

怎么可能用this里面setIntervalsetTimeout电话?

我想用它像:

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

但是我不知道如何在intervalstimeouts做到这一点。

最简单的方法是只保存this到本地。 调用setIntervalsetTimeout回调的上下文不会更改本地self 它将保持原始的this

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

理论上 ,你可以继续在任何地方继续使用this ,并避免thatself等像这样:

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()而不是callapply来避免这种apply

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

在另一个答案中,有一些更详细的信息,以及使用原生ECMAScript 5Underscore.jsprototype.js的替代方案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM