L'utilisation des fonctions fléchées ES6 avec la this
liaison lexicale est excellente.
Cependant, j'ai rencontré un problème il y a un instant en l'utilisant avec une liaison de clic jQuery typique:
class Game {
foo() {
self = this;
this._pads.on('click', function() {
if (self.go) { $(this).addClass('active'); }
});
}
}
En utilisant une fonction de flèche à la place:
class Game {
foo() {
this._pads.on('click', () => {
if (this.go) { $(this).addClass('active'); }
});
}
}
Et puis $(this)
est converti en fermeture de type ES5 (self = this).
Est-il possible que Traceur ignore "$ (this)" pour la liaison lexicale?
.on()
effet unethis
valeur utile pour vous. Pour moi, il est beaucoup plus clair de sethis
référer à la cible de l'événement que d'avoir à passer l'événement et à trouver la cible manuellement. Je n'ai pas beaucoup joué avec les fonctions fléchées, mais il semble que ce serait déroutant de faire des allers-retours avec des fonctions anonymes.Réponses:
Cela n'a rien à voir avec Traceur et la désactivation de quelque chose, c'est simplement ainsi que fonctionne l'ES6. C'est la fonctionnalité spécifique que vous demandez en utilisant à la
=>
place defunction () { }
.Si vous voulez écrire ES6, vous devez écrire ES6 tout le temps, vous ne pouvez pas y basculer et en sortir sur certaines lignes de code, et vous ne pouvez certainement pas supprimer ou modifier le
=>
fonctionnement. Même si vous le pouviez, vous vous retrouveriez avec une version bizarre de JavaScript que vous seul comprenez et qui ne fonctionnerait jamais correctement en dehors de votre Traceur personnalisé, ce qui n'est certainement pas le but de Traceur.La façon de résoudre ce problème particulier n'est pas d'utiliser
this
pour accéder à l'élément cliqué, mais d'utiliser à la placeevent.currentTarget
:jQuery fournit
event.currentTarget
spécifiquement parce que, même avant ES6, il n'est pas toujours possible pour jQuery d'imposer unthis
à la fonction de rappel (c'est-à-dire s'il était lié à un autre contexte viabind
.la source
.on
appels délégués ,this
est en faitevent.currentTarget
.this
==event.currentTarget
. Non?this
etevent.currentTarget
sont les mêmes sauf si ellethis
est liée à la portée englobante, comme avec une fonction flèche ES6.Liaison d'événement
Boucle
la source
$jQueryElements.each()
? jQuery envoie en fait des arguments à chaque objet afin que vous n'en ayez pas besoin du tout => C'est$(...).each((index, el) => console.log(el))
Un autre cas
La première réponse est correcte et je l'ai votée à la hausse.
Cependant, il y a un autre cas:
Peut être corrigé comme:
Il s'agit d'une erreur historique dans jQuery qui met l' index , au lieu de l' élément comme premier argument:
Voir: https://api.jquery.com/each/#each-function
la source
$('jquery-selector').map
(C'est une réponse que j'ai écrite pour une autre version de cette question, avant d'apprendre que c'était un double de cette question. Je pense que la réponse rassemble les informations assez clairement, alors j'ai décidé de l'ajouter en tant que wiki de la communauté, bien que ce soit en grande partie juste différent formulation des autres réponses.)
Vous ne pouvez pas. C'est la moitié du point des fonctions fléchées, elles se ferment au
this
lieu d'avoir leurs propres fonctions définies par la façon dont elles sont appelées. Pour le cas d'utilisation de la question, si vous souhaitezthis
définir par jQuery lors de l'appel du gestionnaire, le gestionnaire doit être unefunction
fonction.Mais si vous avez une raison d'utiliser une flèche (peut-être voulez-vous utiliser
this
pour ce que cela signifie en dehors de la flèche), vous pouvez utiliser à lae.currentTarget
place dethis
si vous le souhaitez:L'objet
currentTarget
on the event est le même que celui défini par jQuerythis
lors de l'appel de votre gestionnaire.la source
Comme l'a dit Meager dans sa réponse à cette même question Si vous voulez écrire ES6, vous devez écrire ES6 tout le temps ,
donc si vous utilisez la fonction fléchée de ES6:,
(event)=>{}
vous devez utiliser à la$(event.currentTarget)
place de$(this)
.vous pouvez également utiliser une manière plus agréable et plus propre d'utiliser currentTarget comme
({currentTarget})=>{}
,à l'origine, cette idée a été commentée par rizzi frank dans la réponse de @ Meager, et je l'ai jugée utile et je pense que tout le monde ne lira pas ce commentaire, alors je l'ai écrit comme une autre réponse.
la source