1

我有一个 JavaScript 类

function MyClass() {

  MyClass.prototype.fooMethod = function () {
    // some logic goes here...
  }

  MyClass.prototype.fooMethod2 = function () {
    this.fooMethod();
  }
}

当我这样调用时,一切都按预期工作:

var m = MyClass();
m.fooMethod2();

但是,当我通过 setInterval 调用此代码时,出现错误:“未捕获的 TypeError:对象 [object DOMWindow] 没有方法 'fooMethod'”

var m = MyClass();
var intervalId = setInterval(m.fooMethod2, 100);

有什么方法可以使用 setInverval 来调用我的方法吗?

4

3 回答 3

4
setInterval(function() {
  m.fooMethod2();
}, 100);

在 javascript 中,上下文( 的值this)由调用方法的方式设置。所以foo.bar()将设置this到函数foo内部bar

但是,当您返回对要由其他东西运行的函数的引用时,不会保留上下文。看一下这个:

var callLater = function(fn) {
  setTimeout(function() {
    fn(); // no defined context, `this` will revert to the default: `window` 
  }, 1000);
};
callLater(foo.bar);

在这个片段中,我们将一个函数传递给callLater函数。但是当我们调用时,fn()我们在没有任何接收者的情况下执行它,这意味着我们失去了上下文。

因此,只要函数上下文很重要,您就必须传入一个匿名函数,该函数将显式调用对象上的方法。

于 2012-04-12T18:15:53.523 回答
1
var m = new MyClass();
var intervalId = setInterval(function(){m.fooMethod2();}, 100);

引用对象时始终使用new关键字,否则您会遇到意外错误。

于 2012-04-12T18:16:28.317 回答
0

将上下文作为参数传递。然后一切都会完美运行。

module.exports = {
   lobby = [],
   init: function () {
      var parent = this;
      setInterval(function () {
        ref.everySecondTick(parent);
      }, 2000);
   },
   everySecondTick: function (parent) {
        console.log(parent.lobby.length);
   }
}
于 2015-12-21T12:34:48.640 回答