Usar las funciones de flecha de ES6 con this
enlace léxico es genial.
Sin embargo, me encontré con un problema hace un momento al usarlo con un enlace de clic típico de jQuery:
class Game {
foo() {
self = this;
this._pads.on('click', function() {
if (self.go) { $(this).addClass('active'); }
});
}
}
Usando una función de flecha en su lugar:
class Game {
foo() {
this._pads.on('click', () => {
if (this.go) { $(this).addClass('active'); }
});
}
}
Y luego $(this)
se convierte a cierre de tipo ES5 (self = this).
¿Es una forma de hacer que Traceur ignore "$ (this)" para el enlace léxico?
.on()
que de hecho tiene unthis
valor útil para usted. Para mí, es mucho más clarothis
referirse al objetivo del evento que tener que pasar el evento y encontrar el objetivo manualmente. No he jugado mucho con las funciones de flecha, pero parece que sería confuso ir y venir con funciones anónimas.Respuestas:
Esto no tiene nada que ver con Traceur y apagar algo, así es simplemente como funciona ES6. Es la funcionalidad específica que está pidiendo usar en
=>
lugar defunction () { }
.Si desea escribir ES6, necesita escribir ES6 todo el tiempo, no puede entrar y salir de él en ciertas líneas de código, y definitivamente no puede suprimir o alterar la forma en que
=>
funciona. Incluso si pudiera, terminaría con una versión extraña de JavaScript que solo usted entiende y que nunca funcionaría correctamente fuera de su Traceur personalizado, que definitivamente no es el objetivo de Traceur.La forma de resolver este problema en particular no es usar
this
para obtener acceso al elemento en el que se hizo clic, sino usarevent.currentTarget
:jQuery proporciona
event.currentTarget
específicamente porque, incluso antes de ES6, no siempre es posible que jQuery imponga unthis
en la función de devolución de llamada (es decir, si estaba vinculado a otro contexto a través debind
.fuente
.on
llamadas delegadas , enthis
realidad lo esevent.currentTarget
.this
==event.currentTarget
. ¿No?this
yevent.currentTarget
son los mismos a menosthis
que estén vinculados al alcance adjunto, como con una función de flecha ES6.Enlace de eventos
Lazo
fuente
$jQueryElements.each()
? jQuery en realidad envía algunos argumentos a cada objeto, por lo que no lo necesita en absoluto => Es$(...).each((index, el) => console.log(el))
Otro caso
La respuesta principal es correcta y la he votado.
Sin embargo, hay otro caso:
Podría arreglarse como:
Este es un error histórico en jQuery que coloca el índice , en lugar del elemento, como primer argumento:
Ver: https://api.jquery.com/each/#each-function
fuente
$('jquery-selector').map
(Esta es una respuesta que escribí para otra versión de esta pregunta, antes de saber que era un duplicado de esta pregunta. Creo que la respuesta reúne la información con bastante claridad, así que decidí agregarla como un wiki de la comunidad, aunque es en gran parte diferente redacción de las otras respuestas.)
No puedes. Eso es la mitad de las funciones de punta de flecha, se cierran en
this
lugar de tener las suyas propias que se establecen según la forma en que se llaman. Para el caso de uso de la pregunta, si deseathis
que jQuery lo establezca al llamar al controlador, el controlador debería ser unafunction
función.Pero si tiene una razón para usar una flecha (quizás quiera usarla
this
por lo que significa fuera de la flecha), puede usar ene.currentTarget
lugar dethis
si lo desea:El
currentTarget
objeto de evento on es el mismo que jQuery establecethis
cuando llama a su controlador.fuente
Como dijo Meager en su respuesta a esta misma pregunta, si desea escribir ES6, debe escribir ES6 todo el tiempo ,
por lo que si está usando la función de flecha de ES6:,
(event)=>{}
entonces debe usar en$(event.currentTarget)
lugar de$(this)
.también puede usar una forma más agradable y limpia de usar currentTarget como
({currentTarget})=>{}
,originalmente, esta idea fue comentada por rizzi frank en la respuesta de @ Meager, y la sentí útil y creo que no todas las personas leerán ese comentario, así que lo escribí como esta otra respuesta.
fuente