Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   this в замыкании (https://javascript.ru/forum/events/67706-v-zamykanii.html)

yajohn 03.03.2017 17:21

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

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

class MyClass {
constructor() {
$("#ButtonID").click(this.doOnClick);
}
doOnClcik() {
this.doSomething();
}
doSomething() {
console.log(this);
}
}
проблема в том, что при вызове doOnClick из замыкания this указывает отнюдь не на мой обьект, а на контекст замыкания, что, в общем-то правильно.
Но как, черт возьми, получить внутри doOnClick ссылку на свой обьект?!
Можно, конечно, через глобальные переменные, но что делать если таких обьектов несколько??? нутром чую что есть что-то более элегантное...

destus 03.03.2017 17:37

yajohn,
$("#ButtonID").click(this.doOnClick.bind(this));

yajohn 03.03.2017 17:44

гхм.. почитал про bind, интересно
однако контекст замыкания мне по ходу тоже нужен.

yajohn 03.03.2017 17:54

A, кажется понял:
constructor() {
self = this;
$("#ButtonID").click(function(){self.doOnClick(thi s)});
}
doOnClcik(sender) { //sender == контекст события
this.doSomething();
}
doSomething() {
console.log(this);
}
}
вроде бы работает. Или есть какой-то более "правильный" путь?

destus 03.03.2017 18:03

yajohn,
:cray:

yajohn 03.03.2017 18:50

Цитата:

Сообщение от destus (Сообщение 446251)
yajohn,
:cray:

Мой метод вызывает аллергическую реакцию??? :blink:

destus 03.03.2017 19:14

yajohn,
чем bind не устроил? да и вообще, вы используете Class из нового JS, но зачем self тогда и function? Стрелочная функция как раз и нужна, чтобы этих костылей не было.

destus 03.03.2017 19:46

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


Часовой пояс GMT +3, время: 17:01.