Прекрасно использовать стрелочные функции ES6 с лексической this
привязкой.
Однако минуту назад я столкнулся с проблемой, используя его с типичной привязкой кликов jQuery:
class Game {
foo() {
self = this;
this._pads.on('click', function() {
if (self.go) { $(this).addClass('active'); }
});
}
}
Вместо этого используйте стрелочную функцию:
class Game {
foo() {
this._pads.on('click', () => {
if (this.go) { $(this).addClass('active'); }
});
}
}
А затем $(this)
преобразуется в закрытие типа ES5 (self = this).
Можно ли заставить Traceur игнорировать "$ (this)" для лексической привязки?
.on()
она действительно имеетthis
полезное для вас значение. Для меня гораздо яснееthis
ссылаться на цель события, чем передавать событие и находить цель вручную. Я не очень много играл со стрелочными функциями, но кажется, что переходить туда и обратно с анонимными функциями было бы непросто.Ответы:
Это не имеет ничего общего с Traceur и отключением чего-либо, просто так работает ES6. Это конкретная функциональность, которую вы просите использовать
=>
вместоfunction () { }
.Если вы хотите написать ES6, вам нужно писать ES6 все время, вы не можете включать и выключать его в определенных строках кода, и вы определенно не можете подавить или изменить способ
=>
работы. Даже если бы вы могли, вы бы просто столкнулись с какой-то причудливой версией JavaScript, которую понимаете только вы и которая никогда не будет работать правильно за пределами вашего настроенного Traceur, что определенно не является целью Traceur.Способ решения этой конкретной проблемы - не использовать
this
для получения доступа к элементу, по которому щелкнули мышью, а вместо этого использоватьevent.currentTarget
:jQuery обеспечивает
event.currentTarget
именно это, потому что даже до ES6 jQuery не всегда может наложить athis
на функцию обратного вызова (т. е. если она была привязана к другому контексту черезbind
.источник
.on
вызовов,this
на самом делеevent.currentTarget
.this
==event.currentTarget
. Нет?this
иevent.currentTarget
являются такими же, если только ониthis
не привязаны к охватывающей области, как с функцией стрелки ES6.Связывание событий
петля
источник
$jQueryElements.each()
? jQuery фактически отправляет некоторые аргументы каждому объекту, поэтому вам это вообще не нужно => Это$(...).each((index, el) => console.log(el))
Другой случай
Главный ответ правильный, и я проголосовал за него.
Однако есть еще один случай:
Может быть исправлено как:
Это историческая ошибка в jQuery, которая ставит индекс вместо элемента в качестве первого аргумента:
См. Https://api.jquery.com/each/#each-function
источник
$('jquery-selector').map
(Это ответ, который я написал для другой версии этого вопроса, до того, как узнал, что это был дубликат этого вопроса. Я думаю, что ответ объединяет информацию довольно четко, поэтому я решил добавить его как вики сообщества, хотя он в основном отличается формулировка других ответов.)
Вы не можете. Это половина функций стрелок, они закрываются,
this
вместо того, чтобы иметь свои собственные, которые задаются способом их вызова. Для случая использования в вопросе, если вы хотитеthis
установить jQuery при вызове обработчика, обработчик должен бытьfunction
функцией.Но если у вас есть причина для использования стрелки (возможно, вы хотите использовать
this
то, что она означает за пределами стрелки), вы можете использоватьe.currentTarget
вместо нее,this
если хотите:Объект
currentTarget
события совпадает с тем, что устанавливает jQuerythis
при вызове обработчика.источник
Как сказал Мигер в своем ответе на тот же вопрос, если вы хотите писать ES6, вам нужно писать ES6 все время ,
поэтому, если вы используете стрелочную функцию ES6 :
(event)=>{}
, тогда вы должны использовать$(event.currentTarget)
вместо$(this)
.вы также можете использовать более приятный и чистый способ использования currentTarget как
({currentTarget})=>{}
,первоначально эта идея была прокомментирована Рицци Фрэнком в ответе @ Meager , и я счел это полезным, и я думаю, что не все люди прочитают этот комментарий, поэтому я написал его как еще один ответ.
источник