【问题标题】:Javascript Passing a method of an object as a functionJavascript将对象的方法作为函数传递
【发布时间】:2013-03-25 09:17:31
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您所描述的内容可能很奇怪,当您习惯于 AS3 或 Java 等语言时 - 但在 JS 中这是预期的行为,默认范围是任何事件或超时的“窗口”-功能等。所以你通常总是需要通过匿名函数。

标签: javascript function methods


【解决方案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.

一个更好的解释是hereJS Guru

【讨论】:

    【解决方案2】:

    运行时会在window对象上执行setTimeout的函数参数(第一个参数),你把test方法直接作为参数,所以你看到this是绑定到窗口对象的你的第一个案例。

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

    【讨论】:

      猜你喜欢
      • 2018-02-23
      • 2012-05-30
      • 2019-08-29
      • 2012-06-12
      • 2012-09-05
      • 2020-06-05
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      相关资源
      最近更新 更多