用goog.bind和goog.net.Xhrio.send理解“this”上下文

时间:2011-12-15 23:43:49

标签: javascript scope this google-closure

当我调用以下代码时,我有点困惑:

goog.net.XhrIo.send("/welcome", goog.bind(this.handleWelcome, this));

我有一个带有此签名的函数:

myproject.MyClass.prototype.handleWelcome = function(response)

在我绑定之前,handleWelcome的上下文无法访问我的Javascript类myproject.MyClass的实例字段(可以理解)。根据信息here,我现在有了类实例的上下文。一切都很好。

在我做出改变之前,“这个”的背景是什么?

请原谅我正在使用的任何非Javascript惯用语 - 我对Java更熟悉,可能会使用大杂烩的术语。

修改

最初我有一些关于什么参数传递给回调的问题(在这种情况下是一个目标类型为goog.net.Xhrio的事件),但主要的问题是关于这个和绑定,所以我删除了切向q。

3 个答案:

答案 0 :(得分:9)

goog.bind相当于function.prototype.bind,但是第一个参数是要绑定的函数,第二个是应该绑定的“this”值,其余任何参数都绑定到函数形式参数

JavaScript具有第一类函数,但它们不是以“this”值继承绑定的,所以除非你绑定它,否则值取决于它的调用方式:

var x = { f : handler };
x.f(); // handler is called with "x" as the this value.
handler(); // unspecified this

传统上,如果“this”值未指定,未定义或为null,则通常会将其强制转换为全局此“窗口”。但是,如果您在EcmaScript 5严格模式下运行,则值保持不变(未指定为“未定义”)。

答案 1 :(得分:1)

这取决于谷歌代码的作用,因为它可以在调用你的回调时将this简单地绑定到某个东西,但它可能是未定义的。

也就是说,在google库的某个地方,它有一个事件处理程序可以执行以下操作:

  goog.whatever.randomHandler = function( foo ) {
    // ...
    if (config.benFlynnHandler) {
      config.benFlynnHandler.call( something_mysterious, someArgument );
    }
    // ...

好的“something_mysterious”可能是null,它可能是一些半有趣的对象,或者谁知道。

答案 2 :(得分:1)

goog.net.XhrIo.send("/welcome", goog.bind(this.handleWelcome, this));

this.handleWelcome中的第一个是对父类(函数)的引用。 第二个是对当前函数的引用;

这是我能解释它的最模糊的方式,也许并非100%在技术上正确,但应该接近。他们可以随时拿着任何东西。

查看正在发生的事情的最简单方法是将两者都传递到控制台,并使用firebug查看包含内容。

希望这有帮助。