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, argumentset n'est pas appelé avec new, 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 thisetarguments
Les fonctions fléchées n'ont ni leur propre thisni leur argumentsliaison. 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, thiset se argumentsréférer aux valeurs de thiset argumentsdans l'environnement, la fonction flèche est définie dans (c'est-à-dire "à l'extérieur" de la fonction flèche):
// Example using a function expression
function createObject() {
console.log('Inside `createObject`:', this.foo);
return {
foo: 42,
bar: function() {
console.log('Inside `bar`:', this.foo);
},
};
}
createObject.call({foo: 21}).bar(); // override `this` inside createObject
// Example using a arrow function
function createObject() {
console.log('Inside `createObject`:', this.foo);
return {
foo: 42,
bar: () => console.log('Inside `bar`:', this.foo),
};
}
createObject.call({foo: 21}).bar(); // override `this` inside createObject
Dans le cas de l'expression de fonction, thisfait référence à l'objet qui a été créé à l'intérieur du createObject. Dans le cas de la fonction flèche, se thisréfère à lui this- createObjectmême.
Cela rend les fonctions fléchées utiles si vous devez accéder à l' thisenvironnement actuel:
// currently common pattern
var that = this;
getData(function(data) {
that.data = data;
});
// better alternative with arrow functions
getData(data => {
this.data = data;
});
Notez que cela signifie également qu'il n'est pas possible de définir une fonction de flèche thisavec .bindou .call.
Si vous n'êtes pas très familier this, pensez à lire
2. 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, ie new User(). Si une fonction peut être appelée, elle peut être appelée sans new(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.
classles 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:
- Fonctions qui n'utilisent pas
thisou arguments.
- Fonctions utilisées avec
.bind(this)
Non remplaçable:
- Fonctions constructeur
- Fonction / méthodes ajoutées à un prototype (car elles utilisent généralement
this)
- Fonctions variadiques (si elles utilisent
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 à utiliser class.
Méthodes prototypes
Probablement pas, car les méthodes prototypes sont généralement utilisées thispour accéder à l'instance. S'ils n'utilisent pas this, vous pouvez le remplacer. Cependant, si vous vous souciez principalement de la syntaxe concise, utilisez-la classavec sa syntaxe de méthode concise:
class User {
constructor(name) {
this.name = name;
}
getName() {
return this.name;
}
}
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:
const obj = {
getName() {
// ...
},
};
Rappels
Ça dépend. Vous devez absolument le remplacer si vous aliasez l'extérieur thisou utilisez .bind(this):
// old
setTimeout(function() {
// ...
}.bind(this), 500);
// new
setTimeout(() => {
// ...
}, 500);
Mais: si le code qui appelle le rappel définit explicitement thisune valeur spécifique, comme c'est souvent le cas avec les gestionnaires d'événements, en particulier avec jQuery, et que le rappel utilise this(ou arguments), 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'utilisation arguments: le paramètre reste .
// old
function sum() {
let args = [].slice.call(arguments);
// ...
}
// new
const sum = (...args) => {
// ...
};
Question connexe:
Autres ressources: