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

Javascript将对象的方法作为函数传递,javascript,function,methods,Javascript,Function,Methods,今天我发现了一个相当奇怪的行为,当您在Javascript中将对象的方法作为函数传递时会发生这种行为 setTimeout(myObject.test, 100); // "this" is the global object window 方法“test”被正确调用,但“this”不是对象“myObject”,而是全局对象“window”。当我这样做时,我可以得到预期的行为: setTimeout(function(){myObject.test()}, 100); // "this" i

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

 setTimeout(myObject.test, 100); // "this" is the global object window
方法“test”被正确调用,但“this”不是对象“myObject”,而是全局对象“window”。当我这样做时,我可以得到预期的行为:

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

我觉得这很奇怪。有人能解释一下原因吗。

运行时将在
window
对象上执行
setTimeout
的函数参数(第一个参数),并且您将
test
方法直接作为参数,因此您可以看到
在第一种情况下,此
是绑定到window对象的


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

结合在一起,考虑一下JavaScript如何解释
设置超时(myObject.test,100)

但是当您这样做时-
setTimeout(function(){myObject.test()},100)
setTimeout
将执行您传递的匿名函数,因此
匿名函数仍将指向
窗口
,但该匿名函数调用另一个函数
myObject.test()
,因为函数被作为对象的方法调用,
将指向该对象

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


更好的解释是,当您习惯于AS3或Java等语言时,您所描述的可能会很奇怪,但在JS中,这是预期的行为,对于任何事件或超时函数等,默认范围都是“窗口”。所以你通常必须通过匿名函数。
function setTimeout(func, millisec) {
    //some code...
    func(); //"this" in func will point to window
    //some code...
}
setTimeout(myObject.test.bind(myObject), 100); //now "this" will point to myObject.