Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.03.2017, 17:21
Новичок на форуме
Отправить личное сообщение для yajohn Посмотреть профиль Найти все сообщения от yajohn
 
Регистрация: 03.03.2017
Сообщений: 4

this в замыкании
дурацкий вопрос, наверное, но уже час блукаю в трех соснах

пусть есть класс, в котором я хочу обрабатывать события, ну например клика по кнопке:

class MyClass {
constructor() {
$("#ButtonID").click(this.doOnClick);
}
doOnClcik() {
this.doSomething();
}
doSomething() {
console.log(this);
}
}
проблема в том, что при вызове doOnClick из замыкания this указывает отнюдь не на мой обьект, а на контекст замыкания, что, в общем-то правильно.
Но как, черт возьми, получить внутри doOnClick ссылку на свой обьект?!
Можно, конечно, через глобальные переменные, но что делать если таких обьектов несколько??? нутром чую что есть что-то более элегантное...
Ответить с цитированием
  #2 (permalink)  
Старый 03.03.2017, 17:37
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

yajohn,
$("#ButtonID").click(this.doOnClick.bind(this));
Ответить с цитированием
  #3 (permalink)  
Старый 03.03.2017, 17:44
Новичок на форуме
Отправить личное сообщение для yajohn Посмотреть профиль Найти все сообщения от yajohn
 
Регистрация: 03.03.2017
Сообщений: 4

гхм.. почитал про bind, интересно
однако контекст замыкания мне по ходу тоже нужен.
Ответить с цитированием
  #4 (permalink)  
Старый 03.03.2017, 17:54
Новичок на форуме
Отправить личное сообщение для yajohn Посмотреть профиль Найти все сообщения от yajohn
 
Регистрация: 03.03.2017
Сообщений: 4

A, кажется понял:
constructor() {
self = this;
$("#ButtonID").click(function(){self.doOnClick(thi s)});
}
doOnClcik(sender) { //sender == контекст события
this.doSomething();
}
doSomething() {
console.log(this);
}
}
вроде бы работает. Или есть какой-то более "правильный" путь?
Ответить с цитированием
  #5 (permalink)  
Старый 03.03.2017, 18:03
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

yajohn,
Ответить с цитированием
  #6 (permalink)  
Старый 03.03.2017, 18:50
Новичок на форуме
Отправить личное сообщение для yajohn Посмотреть профиль Найти все сообщения от yajohn
 
Регистрация: 03.03.2017
Сообщений: 4

Сообщение от destus Посмотреть сообщение
yajohn,
Мой метод вызывает аллергическую реакцию???
Ответить с цитированием
  #7 (permalink)  
Старый 03.03.2017, 19:14
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

yajohn,
чем bind не устроил? да и вообще, вы используете Class из нового JS, но зачем self тогда и function? Стрелочная функция как раз и нужна, чтобы этих костылей не было.
Ответить с цитированием
  #8 (permalink)  
Старый 03.03.2017, 19:46
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

yajohn,
http://jsfiddle.net/jmdenf0o/
У тебя ещё опечатки в коде. Метод в классе называется doOnClcik, а вызываешь ты как doOnClick
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка в замыкании hujak_hujak Элементы интерфейса 11 26.07.2016 09:01
Как лучше решить задачу с утечкой памяти? JSInteres Общие вопросы Javascript 6 27.02.2015 18:19
Помогите в замыкании универсальной функции для обработчиков событий addEventListener iis_ Events/DOM/Window 6 30.01.2014 01:09
Регулярное выражение в замыкании, проблема в IE Octane Общие вопросы Javascript 8 08.12.2008 20:43