当我调用以下代码时,我有点困惑:
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。
答案 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查看包含内容。
希望这有帮助。