Sont "Flèche Fonctions' et 'Fonctions' équivalent / échangeables?
Flèche fonctions dans ES2015 fournir une syntaxe plus concise.
- Puis-je remplacer toutes mes déclarations de fonction /expressions avec flèche fonctions maintenant?
- Que dois-je faire attention?
Exemples:
Fonction constructeur
function User(name) {
this.name = name;
}
//vs
const User = name => {
this.name = name;
};
Prototype des méthodes
User.prototype.getName = function() {
return this.name;
};
//vs
User.prototype.getName = () => this.name;
Objet (littérale) de méthodes
const obj = {
getName: function() {
//...
}
};
//vs
const obj = {
getName: () => {
//...
}
};
Rappels
setTimeout(function() {
//...
}, 500);
//vs
setTimeout(() => {
//...
}, 500);
Variadic fonctions
function sum() {
let args = [].slice.call(arguments);
//...
}
//vs
const sum = (...args) => {
//...
};
- Des questions similaires sur la flèche fonctions sont venus de plus en plus avec ES2015 de plus en plus populaire. Je n'ai pas envie de il y avait une bonne canonique de question/réponse pour ce problème j'ai donc créé ce un. Si vous pensez qu'il y a déjà un bon un, s'il vous plaît laissez-moi savoir et je vais fermer celui-ci que les dupliquer ou de les supprimer. N'hésitez pas à améliorer les exemples ou en ajouter de nouvelles.
- Ce sujet JavaScript ecma6 changement de la fonction normale de la flèche de la fonction? Bien sûr, une question normale ne peut jamais être aussi bon et générique comme un spécifiquement écrit pour être canonique.
- Regardez ce Plnkr exemple La variable
this
est très différenttimesCalled
incréments seulement par 1 chaque fois que le bouton est appelé. Ce qui répond à ma question personnelle:.click( () => { } )
et.click(function() { })
à la fois de créer le même nombre de fonctions lorsqu'il est utilisé dans une boucle comme vous pouvez le voir à partir du Guid compter dans le Plnkr. - Related post - Quand dois-je utiliser la Flèche fonctions dans ECMAScript 6?
Vous devez vous connecter pour publier un commentaire.
tl;dr: Pas! Flèche fonctions et les déclarations de fonction /expressions ne sont pas équivalentes et ne peuvent pas être remplacés à l'aveuglette.
Si la fonction que vous voulez remplacer ne pas utilisation
this
,arguments
et n'est pas appelé avecnew
, alors oui.Comme si souvent: ça dépend. Flèche fonctions ont un comportement différent de déclarations de fonction /expressions, donc permet d'avoir un regard sur les différences premières:
1. Lexicale
this
etarguments
Flèche fonctions n'ont pas leur propre
this
ouarguments
de liaison. Au lieu de cela, ces identifiants sont résolus dans la portée lexicale comme toute autre variable. Cela signifie que l'intérieur d'une flèche fonction,this
etarguments
référer aux valeurs dethis
etarguments
dans l'environnement de la flèche en fonction défini dans (c'est à dire "en dehors de" la flèche de la fonction):JS:
JS:
Dans l'expression de fonction cas,
this
fait référence à l'objet qui a été créé à l'intérieur de lacreateObject
. Dans le cas de fonction de flèche,this
se réfère àthis
decreateObject
lui-même.Ce fait flèche de fonctions utiles si vous avez besoin d'accéder à la
this
de l'environnement actuel:Note que cela signifie aussi qui est pas possible de définir une flèche en fonction de la
this
avec.bind
ou.call
.Si vous n'êtes pas très familier avec
this
, pensez à lire2. Flèche fonctions ne peuvent pas être appelée avec
new
ES2015 fait la distinction entre les fonctions qui sont appelmesure et les fonctions qui sont construiremesure. Si une fonction est constructable, elle peut être appelée avec
new
, c'est à direnew User()
. Si une fonction est remboursable, il peut être appelé sansnew
(c'est à dire normal appel de fonction).Fonctions créées par les déclarations de fonction /expressions sont à la fois constructable et exigible.
Flèche fonctions (méthodes) sont uniquement remboursables.
class
constructeurs ne sont constructable.Si vous essayez d'appeler un non-rachetable de la fonction ou de la construction d'un non-constructable fonction, vous obtiendrez une erreur d'exécution.
Sachant cela, nous pouvons affirmer ce qui suit.
Remplaçable:
this
ouarguments
..bind(this)
Pas remplaçable:
this
)arguments
(voir ci-dessous))Vous permet de regarder de plus près ce à l'aide de votre exemples:
Fonction constructeur
Cela ne marchera pas, parce que la flèche fonctions ne peuvent pas être appelée avec
new
. Gardez à l'aide d'une déclaration de fonction /de l'expression ou de l'utilisationclass
.Prototype des méthodes
Probablement pas, parce que prototype des méthodes généralement utiliser
this
pour accéder à l'instance. S'ils n'utilisent pasthis
, alors vous pouvez le remplacer. Toutefois, si vous utilisez principalement des soins de concise de la syntaxe, l'utilisationclass
avec ses concis méthode syntaxe:Méthodes de l'objet de
De même pour les méthodes d'un objet littéral. Si la méthode se veut de référence de l'objet lui-même via
this
, gardez à l'aide des expressions de fonction, ou de l'utilisation de la nouvelle méthode de syntaxe:Rappels
Il dépend. Vous devez absolument la remplacer, si vous vous êtes aliasing l'extérieur
this
ou utilisez.bind(this)
:Mais: Si le code qui appelle la fonction de 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 le rappel utilisethis
(ouarguments
), vous ne peut pas une flèche fonction!Variadic fonctions
Depuis flèche fonctions n'ont pas leur propre
arguments
, vous ne pouvez pas tout simplement de les remplacer par une flèche fonction. Cependant, ES2015 introduit une alternative à l'utilisation dearguments
: le reste paramètre.Liés à la question:
D'autres ressources:
this
affecte égalementsuper
et qu'ils n'ont pas.prototype
.AssignmentExpression
) ne peut pas être abandonné partout, une expression de fonction (PrimaryExpression
) le pouvoir et les voyages de personnes assez souvent (surtout depuis il y a eu des erreurs d'analyse dans les grandes JS implémentations).() => {}()
) ou de faire quelque chose commex || () => {}
. C'est ce que je veux dire: le temps d'exécution (parse) des erreurs. (Et même si c'est le cas, assez fréquemment les gens pense que l'erreur est dans l'erreur.) Etes-vous en essayant de couvrir les erreurs de logique qui serait passé inaperçu parce qu'ils ne sont pas forcément d'erreur lors de l'analyse ou exécutés?new
'ing est une erreur d'exécution droit?that
en dehors de la fonction et de l'écrire avecthis
n'est pas toujours garanti dans le cas d'objets imbriqués/fonctions. Cela dépend d'oùthat
est fixé àthis
. Je vois ce que vous voulez le montrer, mais il y a une chance énorme de la lecture il. Anon fournir certaines fonctionnalités qui ne peuvent pas être recréés avec l'aiguille courte et ce point devrait être celui que vous êtes au volant de la maison.var that = this;
modèle. C'est juste inclus parce que c'est un modèle commun et exactement le même que celui que la flèche fonctions sont censés remplacer.function
mot-clé, mais ce qui vient avant lafunction
mot-clé détermine si la définition de la fonction est interprété comme une déclaration ou d'une expression. Cette partie ne fait pas partie de l'expression de fonction si. E. g. si vous avezfoo = function (){}
, puis le=
fait partie de la mission de l'expression, et non pas l'expression de fonction.(...)()
partie ne fait pas partie de la fonction d'expression. C'est tout ce que je dis.function foo(...) { return ... }
etconst foo = (...) => { return ... }
, pourtant je vois le dernier motif est utilisé très fréquemment, surtout dans Réagissent les bibliothèques. Pourquoi créer une fonction anonyme et l'assigner à une constante, lorsqu'une fonction régulière déclaration ferait la même chose?foo
dans le premier cas, plus tard, tandis queconst
l'en empêche. Pas sûr que ce soit la raison de bien.