-->

如何更改的“本”中的setInterval和setTimeout的功能范围(How do I cha

2019-09-19 04:40发布

怎么可能用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

Answer 1:

最简单的方法是只保存this到本地。 本地self不受具体的上下文改变setIntervalsetTimeout回调被调用。 这反而维持原来的this

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


Answer 2:

从理论上讲 ,你可以做继续使用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

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

有一些更详细,并使用原生的ECMAScript 5的替代品,Underscore.js并在此等答案的prototype.js



文章来源: How do I change scope of “this” in setInterval and setTimeout functions