Понимание этого контекста с помощью goog.bind и goog.net.Xhrio.send - PullRequest
6 голосов
/ 16 декабря 2011

Я немного смущен тем, что происходит, когда я вызываю следующий код:

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

У меня есть функция с такой подписью:

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

До того, как я связался, контекст handleWelcome не имел доступа к полям экземпляра моего класса Javascript myproject.MyClass (по понятным причинам). Следуя информации здесь , теперь у меня есть контекст экземпляра класса. Все хорошо.

Каков был контекст «этого» до того, как я внес изменение?

Пожалуйста, извините за любые не-Javascript идиомы, которые я использую - я гораздо лучше знаком с Java и, вероятно, использую смесь терминов.

EDIT

Изначально у меня были некоторые вопросы о том, какой аргумент передается в функцию обратного вызова (в данном случае это событие с целью типа goog.net.Xhrio), но основной вопрос - об этом и bind, поэтому я удалил тангенциальные q.

Ответы [ 3 ]

9 голосов
/ 16 декабря 2011

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, оно обычно приводится к глобальному this, обычно "окну".Однако, если вы работаете в строгом режиме EcmaScript 5, значение остается неизменным (не указано «undefined»).

1 голос
/ 16 декабря 2011
goog.net.XhrIo.send("/welcome", goog.bind(this.handleWelcome, this));

первая this в this.handleWelcome является ссылкой на родительский класс (функцию). второе - это ссылка на текущую функцию;

Это самый расплывчатый способ, которым я могу объяснить это, и, возможно, это не на 100% технически правильно, но должно быть близко. Они могут держать что-нибудь или ничего.

Самый простой способ увидеть, что происходит, - передать оба на консоль и посмотреть, что в нем содержится, используя, возможно, firebug.

Надеюсь, это поможет.

1 голос
/ 16 декабря 2011

Это зависит от того, что делает код Google, так как он может определенным образом связать this с чем-либо, когда он вызывает ваш обратный вызов, но, вероятно, он не определен.есть обработчик событий, который делает что-то вроде:

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

ну что-то "some_mysterious" может быть null, это может быть какой-то полуинтересный объект, или кто знает.

...