J'expérimente avec ES6 depuis un moment maintenant, et je viens juste d'arriver à un léger problème.
J'aime vraiment utiliser les fonctions fléchées, et chaque fois que je peux, je les utilise.
Cependant, il semblerait que vous ne puissiez pas les lier!
Voici la fonction:
var f = () => console.log(this);
Voici l'objet auquel je souhaite associer la fonction:
var o = {'a': 42};
Et voici comment je me lierais f
à o
:
var fBound = f.bind(o);
Et puis je peux simplement appeler fBound
:
fBound();
Ce qui affichera ceci (l' o
objet):
{'a': 42}
Cool! Charmant! Sauf que ça ne marche pas. Au lieu de sortir l' o
objet, il sort l' window
objet.
Alors j'aimerais savoir: pouvez-vous lier des fonctions fléchées? (Et si oui, comment?)
J'ai testé le code ci-dessus dans Google Chrome 48 et Firefox 43, et le résultat est le même.
javascript
function
ecmascript-6
Florrie
la source
la source
this
de leur étendue parent.Réponses:
Vous ne pouvez pas relier
this
dans une fonction de flèche. Il sera toujours défini comme le contexte dans lequel il a été défini. Si vous avez besointhis
d'être significatif, vous devez utiliser une fonction normale.D'après les spécifications ECMAScript 2015 :
la source
this
. Les deux sont liés, mais pas les mêmes.this
à l'intérieur d'une fonction de flèche «hérite» toujoursthis
de la portée englobante. C'est une caractéristique des fonctions fléchées. Mais vous pouvez toujoursbind
tous les autres paramètres d'une fonction fléchée. Mais nonthis
.Pour être complet, vous pouvez relier les fonctions fléchées, vous ne pouvez tout simplement pas changer la signification de
this
.bind
a toujours de la valeur pour les arguments de fonction:Essayez-le ici: http://jsbin.com/motihanopi/edit?js,console
la source
this
auquel la fonction (flèche) est liée, sans référence (ce qui est, bien sûr, défini lexicalement)?Du MDN :
Cela signifie que vous ne pouvez pas lier une valeur à ce
this
que vous voulez.la source
Pendant des années, les développeurs js ont eu du mal avec la liaison de contexte, ont demandé pourquoi
this
changé en javascript, tant de confusion au fil des ans en raison de la liaison de contexte et de la différence entre la signification dethis
en javascript etthis
dans la plupart des autres langages POO.Tout cela m'amène à me demander pourquoi, pourquoi! pourquoi ne voudriez-vous pas relier une fonction de flèche! Ceux où créé spécialement pour résoudre tous ces problèmes et confusions et éviter d' avoir à utiliser
bind
oucall
ou tout autre moyen de préserver la portée de la fonction.TL; DR
Non, vous ne pouvez pas relier les fonctions fléchées.
la source
this
n'est pas fonctionnelle. lambdas devrait l'êtrearguments => output
. Si vous avez besoin d'un contexte externe, transmettez-le. L'existence même dethis
est ce qui a facilité tout le chaussage des modèles OO dans la langue. Vous n'auriez jamais entendu le terme «classe javascript» sans lui.this
.Vous ne pouvez pas utiliser
bind
pour modifier la valeur de l'this
intérieur d'une fonction de flèche. Cependant, vous pouvez créer une nouvelle fonction régulière qui fait la même chose que l'ancienne fonction de flèche, puis utilisercall
oubind
pour relierthis
comme d'habitude.Nous utilisons un
eval
appel ici pour recréer la fonction de flèche que vous passez en tant que fonction normale, puiscall
pour l'invoquer avec un autrethis
:la source
Les fonctions fléchées ES6 résolvent vraiment «ceci» en JavaScript
Le lien ci-dessus explique que les fonctions fléchées
this
ne changent pas avec lesbind, call, apply
fonctions.C'est expliqué avec un très bel exemple.
exécutez ceci
node v4
pour voir le comportement "attendu",la source
J'ai posé la même question il y a quelques jours.
Vous ne pouvez pas lier une valeur car le
this
est déjà lié.Liaison différente de cette portée à ES6 => opérateur de fonction
la source
this
est également lié. Le fait est que dans les fonctions fléchées, il n'a pas de liaison locale .Bref, vous NE POUVEZ PAS lier les fonctions fléchées, mais lisez la suite:
Imaginez que vous avez cette fonction de flèche ci-dessous qui s'imprime
this
sur la console:Donc, la solution rapide pour cela serait d'utiliser la fonction normale, alors changez-la simplement en:
Ensuite, vous pouvez le lier à n'importe quel environnement lexical en utilisant
bind
oucall
ouapply
:et appelez-le en cas de
bind
.Il existe également des moyens d'utiliser
eval()
pour le faire, ce qui est fortement déconseillé .la source
function myFunc
est comportementalement différent en plus d'être lié; un match plus proche seraitconst myFunc = function() {...}
. Je suis également curieux de savoir ce que vous entendez en utilisant eval, puisque c'est une approche que je ne pense pas avoir partagée ici auparavant - il serait intéressant de voir comment cela se fait, puis de lire pourquoi c'est si fortement déconseillé.Peut-être que cet exemple vous aidera:
la source