Javascript将对象的方法作为函数传递

时间:2013-03-25 09:17:32

标签: javascript function methods

今天我发现在Javascript中将对象的方法作为函数传递时会发生一种相当奇怪的行为。

 setTimeout(myObject.test, 100); // "this" is the global object window

正确调用方法“test”,但“this”不是对象“myObject”,而是全局对象“window”。当我做这样的事情时,我可以得到预期的行为:

setTimeout(function(){myObject.test()}, 100); // "this" is myObject

这在我看来相当奇怪。任何人都可以解释一下,为什么会这样。

2 个答案:

答案 0 :(得分:1)

运行时将对setTimeout对象上的window执行函数参数(第一个参数),并直接将test方法作为参数,因此您会看到{{1在第一种情况下,它是与窗口对象的绑定。

在第二种情况下,在this对象上执行的函数是您的匿名函数window,但function() { myObject.test() }方法是在test上调用的,这就是您看到的原因myObjectthis

绑定

答案 1 :(得分:1)

考虑这种伪表示,JavaScript将如何解释setTimeout(myObject.test, 100);

function setTimeout(func, millisec) {
    //some code...
    func(); //"this" in func will point to window
    //some code...
}

但是当你这样做 - setTimeout(function(){myObject.test()}, 100);时,setTimeout会执行你传递的匿名函数,所以this匿名函数仍会指向window,但匿名函数调用另一个函数myObject.test(),因为函数被称为对象的方法,this将指向该对象。

您可以使用很酷的JS函数bind来解决这个问题。

setTimeout(myObject.test.bind(myObject), 100); //now "this" will point to myObject.

here

更好的解释是JS Guru