2

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

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

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

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

这在我看来相当奇怪。谁能解释一下,为什么会这样。

4

2 回答 2

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提供更好的解释

于 2013-03-25T09:37:10.090 回答
1

运行时将为setTimeoutonwindow对象执行函数参数(第一个参数),并且您将test方法直接作为参数,因此您this在第一种情况下会看到绑定到窗口对象。

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

于 2013-03-25T09:28:00.687 回答