Les fonctions fléchées d'ES2015 fournissent une syntaxe plus concise.
- Puis-je remplacer toutes mes déclarations / expressions de fonction par des fonctions fléchées maintenant?
- À quoi dois-je faire attention?
Exemples:
Fonction constructeur
function User(name) {
this.name = name;
}
// vs
const User = name => {
this.name = name;
};
Méthodes prototypes
User.prototype.getName = function() {
return this.name;
};
// vs
User.prototype.getName = () => this.name;
Méthodes d'objets (littérales)
const obj = {
getName: function() {
// ...
}
};
// vs
const obj = {
getName: () => {
// ...
}
};
Rappels
setTimeout(function() {
// ...
}, 500);
// vs
setTimeout(() => {
// ...
}, 500);
Fonctions variadiques
function sum() {
let args = [].slice.call(arguments);
// ...
}
// vs
const sum = (...args) => {
// ...
};
javascript
ecmascript-6
arrow-functions
Felix Kling
la source
la source
this
est très différentetimesCalled
par incréments de 1 seulement à chaque fois que le bouton est appelé. Ce qui répond à ma question personnelle:.click( () => { } )
et les.click(function() { })
deux créent le même nombre de fonctions lorsqu'ils sont utilisés dans une boucle comme vous pouvez le voir dans le décompte Guid dans le Plnkr.Réponses:
tl; dr: Non! Les fonctions fléchées et les déclarations / expressions de fonction ne sont pas équivalentes et ne peuvent pas être remplacées à l'aveugle.
Si la fonction que vous souhaitez remplacer ne pas utiliser
this
,arguments
et n'est pas appelé avecnew
, alors oui.Comme souvent: cela dépend . Les fonctions fléchées ont un comportement différent de celui des déclarations / expressions de fonction, alors examinons d'abord les différences:
1. Lexique
this
etarguments
Les fonctions fléchées n'ont ni leur propre
this
ni leurarguments
liaison. Au lieu de cela, ces identificateurs sont résolus dans la portée lexicale comme toute autre variable. Cela signifie qu'à l'intérieur d'une fonction flèche,this
et searguments
référer aux valeurs dethis
etarguments
dans l'environnement, la fonction flèche est définie dans (c'est-à-dire "à l'extérieur" de la fonction flèche):Dans le cas de l'expression de fonction,
this
fait référence à l'objet qui a été créé à l'intérieur ducreateObject
. Dans le cas de la fonction flèche, sethis
réfère à luithis
-createObject
même.Cela rend les fonctions fléchées utiles si vous devez accéder à l'
this
environnement actuel:Notez que cela signifie également qu'il n'est pas possible de définir une fonction de flèche
this
avec.bind
ou.call
.Si vous n'êtes pas très familier
this
, pensez à lire2. Les fonctions fléchées ne peuvent pas être appelées avec
new
ES2015 établit une distinction entre les fonctions qui appellent mesure et les fonctions qui sont construire en mesure. Si une fonction est constructible, elle peut être appelée avec
new
, ienew User()
. Si une fonction peut être appelée, elle peut être appelée sansnew
(c'est-à-dire un appel de fonction normal).Les fonctions créées par des déclarations / expressions de fonction sont à la fois constructibles et appelables.
Les fonctions fléchées (et méthodes) ne peuvent être appelées.
class
les constructeurs sont uniquement constructibles.Si vous essayez d'appeler une fonction non appelable ou de construire une fonction non constructible, vous obtiendrez une erreur d'exécution.
Sachant cela, nous pouvons affirmer ce qui suit.
Remplaçable:
this
ouarguments
..bind(this)
Non remplaçable:
this
)arguments
(voir ci-dessous))Regardons cela de plus près en utilisant vos exemples:
Fonction constructeur
Cela ne fonctionnera pas car les fonctions fléchées ne peuvent pas être appelées avec
new
. Continuez à utiliser une déclaration / expression de fonction ou à utiliserclass
.Méthodes prototypes
Probablement pas, car les méthodes prototypes sont généralement utilisées
this
pour accéder à l'instance. S'ils n'utilisent pasthis
, vous pouvez le remplacer. Cependant, si vous vous souciez principalement de la syntaxe concise, utilisez-laclass
avec sa syntaxe de méthode concise:Méthodes d'objet
De même pour les méthodes dans un objet littéral. Si la méthode veut référencer l'objet lui-même via
this
, continuez à utiliser des expressions de fonction ou utilisez la nouvelle syntaxe de la méthode:Rappels
Ça dépend. Vous devez absolument le remplacer si vous aliasez l'extérieur
this
ou utilisez.bind(this)
:Mais: si le code qui appelle le rappel définit explicitement
this
une valeur spécifique, comme c'est souvent le cas avec les gestionnaires d'événements, en particulier avec jQuery, et que le rappel utilisethis
(ouarguments
), vous ne pouvez pas utiliser une fonction de flèche!Fonctions variadiques
Étant donné que les fonctions fléchées n'ont pas les leurs
arguments
, vous ne pouvez pas simplement les remplacer par une fonction fléchée. Cependant, ES2015 introduit une alternative à l'utilisationarguments
: le paramètre reste .Question connexe:
Autres ressources:
la source
this
affecte égalementsuper
et qu'il n'a pas.prototype
.AssignmentExpression
) ne peut pas simplement être supprimée partout où une expression de fonction (PrimaryExpression
) le peut et elle déclenche les gens assez fréquemment (surtout depuis qu'il y a eu analyse erreurs dans les implémentations JS majeures).() => {}()
) ou faire quelque chose commex || () => {}
. C'est ce que je veux dire: les erreurs d'exécution (analyse). (Et même si c'est le cas, les gens pensent assez souvent que l'erreur est erronée.) Essayez-vous simplement de couvrir les erreurs logiques qui passeraient inaperçues car elles ne font pas nécessairement d'erreur lorsqu'elles sont analysées ou exécutées?new
'un est une erreur d'exécution, non?Attendez, vous ne pouvez pas utiliser la fonction flèche partout dans votre code, cela ne fonctionnera pas dans tous les cas, comme
this
lorsque les fonctions flèche ne sont pas utilisables. Sans aucun doute, la fonction flèche est un excellent ajout, elle apporte la simplicité du code.Mais vous ne pouvez pas utiliser une fonction de flèche lorsqu'un contexte dynamique est requis: définir des méthodes, créer des objets avec des constructeurs, en tirer la cible lors de la gestion des événements.
Les fonctions fléchées ne doivent PAS être utilisées car:
Ils n'ont pas
this
Il utilise la «portée lexicale» pour déterminer quelle
this
devrait être la valeur de « ». Dans un champ lexical de mots simples, il utilise «this
» de l'intérieur du corps de la fonction.Ils n'ont pas
arguments
Les fonctions fléchées n'ont pas d'
arguments
objet. Mais la même fonctionnalité peut être obtenue en utilisant des paramètres de repos.let sum = (...args) => args.reduce((x, y) => x + y, 0)
sum(3, 3, 1) // output - 7
"Ils ne peuvent pas être utilisés avec
new
Les fonctions fléchées ne peuvent pas être des interprètes car elles n'ont pas de propriété prototype.
Quand utiliser la fonction flèche et quand non:
map
,reduce
ouforEach
.la source
arguments
objet spécial qui n'est pas disponible dans les fonctions fléchées ici: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Pour utiliser les fonctions fléchées avec
function.prototype.call
, j'ai créé une fonction d'aide sur le prototype d'objet:usage
Éditer
Vous n'avez pas besoin d'aide. Vous pourriez faire:
la source