我有一个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来调用我的方法吗?
答案 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
关键字,否则最终会出现意外错误。