2013-03-25 51 views
2

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

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

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

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

这对我来说似乎很奇怪。有人可以解释,为什么这是。

+1

你所描述可奇怪的是,当你使用像AS3或Java语言 - 但在JS这是预期的行为,默认的作用域是任何事件或超时功能等的“窗口”。所以你通常必须经历匿名功能。 – olsn 2013-03-25 09:25:28

回答

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将执行anonymou因为this匿名函数仍然会指向window,但是那个匿名函数会调用另一个函数myObject.test(),因为函数被称为对象的方法,所以this会指向那个对象。

你可以通过使用一个很酷的JS功能bind来解决这个问题。

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

一个更好的解释是hereJS Guru

1

运行时间将执行上window对象setTimeout函数的参数(第一个参数),你直接把test方法作为参数,所以你看this是债券,以窗口对象在第一种情况下。

在你的第二个情况下,window对象执行的功能是你的匿名函数function() { myObject.test() },但是,test方法被调用的myObject,这就是为什么你看到this是债券,以myObject

相关问题