javascript类 - 使用setInterval调用this.method

时间:2012-04-12 18:15:15

标签: javascript

我有一个JavaScript类

function MyClass() {

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

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

当我这样打电话时,一切都按预期工作:

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

但是当我有这个由setInterval调用的代码时,我得到一个错误:“未捕获的TypeError:对象[对象DOMWindow]没有方法'fooMethod'”

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

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

2 个答案:

答案 0 :(得分: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()时,我们没有任何接收器,这意味着我们失去了上下文。

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

答案 1 :(得分:1)

var m = new MyClass();
var intervalId = setInterval(function(){m.fooMethod2();}, 100);

在引用对象时始终使用new关键字,否则最终会出现意外错误。