今天我发现在Javascript中将对象的方法作为函数传递时会发生一种相当奇怪的行为。
setTimeout(myObject.test, 100); // "this" is the global object window
正确调用方法“test”,但“this”不是对象“myObject”,而是全局对象“window”。当我做这样的事情时,我可以得到预期的行为:
setTimeout(function(){myObject.test()}, 100); // "this" is myObject
这在我看来相当奇怪。任何人都可以解释一下,为什么会这样。
答案 0 :(得分:1)
运行时将对setTimeout
对象上的window
执行函数参数(第一个参数),并直接将test
方法作为参数,因此您会看到{{1在第一种情况下,它是与窗口对象的绑定。
在第二种情况下,在this
对象上执行的函数是您的匿名函数window
,但function() { myObject.test() }
方法是在test
上调用的,这就是您看到的原因myObject
与this
答案 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.
更好的解释是JS Guru