Javascript: проблема с ключевым словом "this" со слушателями событий - PullRequest
2 голосов
/ 06 сентября 2011

У меня проблема с обработчиками событий в javascript, возможно, из-за моего неполного контроля над языком.

Я хочу зарегистрировать прослушиватели событий, используя addEventListener () / attachEvent ();Я также хочу иметь возможность удалить слушателей позже, поэтому я не могу зарегистрировать анонимные функции.

Скажем, теперь я хочу зарегистрировать метод объекта в качестве прослушивателя событий.Сначала я ожидал, что addEventListener(event, node, object.method) будет работать.Однако после прочтения событий я теперь понимаю, что ключевое слово this будет ссылаться на цель события при вызове прослушивателя событий, а не на мой объект.

Чтобы обойти это, я создал новый метод methodCallback объекта, например:

object.methodCallback = function () {
    self.method(); 
}

переменная self установлена ​​для копирования this в объектеконструктор.Затем я регистрирую object.methodCallback в качестве обработчика событий.

Мне кажется, это неправильный способ сделать это.Но какой правильный путь?

Я прошу прощения, если этот вопрос является распространенным, но я до сих пор не смог найти ответ по SO

Ответы [ 2 ]

2 голосов
/ 06 сентября 2011

Обычно люди используют себя таким образом. Я бы сказал, используйте «Я», если вы находитесь в классе и «это», если нет.

Вам нужно определить себя / этот уровень выше в цепочке областей действия.

var self = this;
object.methodCallback = function () {
    self.method(); 
}

И да, это так, как он катится. К сожалению.

0 голосов
/ 06 сентября 2011

Переназначение «этой области видимости», чтобы вы могли ссылаться на нее позже, является приемлемым поведением в Javascript, поскольку оно, вероятно, понадобится вам позже.Библиотека Javascript, такая как jQuery и YUI, предоставляет вам простую в использовании функцию (например, $. Proxy () в jQuery или YUI.bind () ) для этого.Учитывая, что они предоставляют вам такую ​​функцию, я предполагаю, что это распространенный метод в JS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...