Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript “理解”;这";带有goog.bind和goog.net.Xhrio.send的上下文_Javascript_Scope_This_Google Closure - Fatal编程技术网

Javascript “理解”;这";带有goog.bind和goog.net.Xhrio.send的上下文

Javascript “理解”;这";带有goog.bind和goog.net.Xhrio.send的上下文,javascript,scope,this,google-closure,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的实例字段(可以理解)。根据这些信息,我现在有了

我对调用以下代码时会发生什么感到有点困惑:

goog.net.XhrIo.send("/welcome", goog.bind(this.handleWelcome, this));
我有一个带有此签名的函数:

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

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

请原谅我使用的任何非Javascript习惯用法——我对Java更为熟悉,可能使用的是各种术语

编辑


最初,我有一些关于将什么参数传递给回调的问题(在本例中是一个目标类型为goog.net.Xhrio的事件),但主要问题是关于这个和bind,所以我删除了相切的q。

这取决于google代码的功能,因为它可以在调用回调时简明地将
这个
绑定到某个对象,但它可能没有定义

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

  goog.whatever.randomHandler = function( foo ) {
    // ...
    if (config.benFlynnHandler) {
      config.benFlynnHandler.call( something_mysterious, someArgument );
    }
    // ...
“神秘的东西”可能是
null
,可能是一些半有趣的对象,或者谁知道呢

goog.net.XhrIo.send("/welcome", goog.bind(this.handleWelcome, this));
this.handleWelcome中的第一个是对父类(函数)的引用。 第二,这是对当前函数的引用

这是我能解释的最含糊的方式,也许在技术上不是100%正确,但应该很接近。他们可能拿着任何东西或什么都没有

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


希望这有帮助。

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

JavaScript具有第一类函数,但它们没有继承地与“this”值绑定,因此除非您绑定它,否则该值取决于调用它的方式:

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

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

这是有道理的,但也许我应该让我的问题更清楚。如果我这样做了会怎么样:goog.net.XhrIo.send(“/welcome”,this.handleWelcome);在handleWelcome执行过程中,“this”的上下文是什么?我一直在调试器中摸索,试图更好地理解它。第二,这应该是对调用bind的对象的引用,而不是函数,是吗?啊,很有趣。所以在某个地方,它使用“call”来调用我的welcomeHandler,并带有一些参数?我想它最终会变成一个XmlHttpResponse之类的东西;它可能正在执行“.call()”操作,也可能正在执行其他操作。关键是,如果您不知道框架的功能,那么您就是不知道。