2012-04-12 55 views
1

我有一个JavaScript类JavaScript类 - this.method调用的setInterval

function MyClass() { 

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

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

一切正常,当我打电话是这样的:

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

然而,当我有这样的代码被称为的setInterval我得到一个错误: “遗漏的类型错误:对象[对象DOMWindow]有没有方法 'fooMethod'”

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

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

+0

@Alex韦恩是正确的,但要帮助启发你,为什么,你可能需要阅读http://stackoverflow.com/questions/133973/how-does-this-keyword-work-within- a-javascript-object-literal – Matt 2012-04-12 18:20:00

回答

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

在javascript中,上下文(值为this)由该方法的调用方式设置。因此foo.bar()将在bar函数内设置thisfoo

但是当你返回一个函数的引用被其他东西运行时,上下文不会被保留。检查了这一点:

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

在这个片段中,我们通过一个函数到callLater功能。但是当我们调用fn()时,我们没有任何接收器,这意味着我们失去了上下文。因此,任何时候函数上下文都很重要,你必须传入一个匿名函数,它将明确地调用对象的方法。

+0

是的,我并不熟悉如何保留上下文,对javascript还是有点新鲜。谢谢 – 2012-04-12 18:23:14

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

请务必在引用对象时使用new关键字,否则将会发生意外错误。

+0

Jeez!我怎么没有发现!接得好! – gideon 2012-04-12 18:18:34

+0

没问题,很高兴我能帮上忙。 – 2012-04-12 18:18:51

0

将上下文作为参数传递。那么所有的都会完美地运作

module.exports = { 
    lobby = [], 
    init: function() { 
     var parent = this; 
     setInterval(function() { 
     ref.everySecondTick(parent); 
     }, 2000); 
    }, 
    everySecondTick: function (parent) { 
     console.log(parent.lobby.length); 
    } 
}