Вход

Просмотр полной версии : this в замыкании


yajohn
03.03.2017, 17:21
дурацкий вопрос, наверное, но уже час блукаю в трех соснах :-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(this)});
}
doOnClcik(sender) { //sender == контекст события
this.doSomething();
}
doSomething() {
console.log(this);
}
}
вроде бы работает. Или есть какой-то более "правильный" путь?

destus
03.03.2017, 18:03
yajohn,
:cray:

yajohn
03.03.2017, 18:50
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