web-dev-qa-db-fra.com

Informations officielles sur les «arguments» dans les fonctions flèches ES6?

(() => console.log(arguments))(1,2,3);

// Chrome, FF, Node give "1,2,3"
// Babel gives "arguments is not defined" from parent scope

Selon Babel (et d'après ce que je peux dire des recommandations initiales du TC39), c'est "invalide" car les fonctions fléchées devraient utiliser leur portée parent pour les arguments. La seule information que j'ai pu trouver qui contredit ceci est un seul commentaire disant que cela a été rejeté par TC39, mais je ne trouve rien pour étayer cela.

Je cherche juste des documents officiels ici.

41
Mark Kahn

Chrome, FF et node semblent avoir tort ici, Babel a raison:

Les fonctions fléchées n'ont pas de liaison arguments propre dans leur portée; aucun objet arguments n'est créé lors de leur appel.

à la recherche de documents officiels ici

Les expressions de fonction de flèche évaluent les fonctions qui ont leur [[ThisMode]] défini à lexical, et lorsqu'elles sont appelées instanciation de déclaration ne crée pas de - arguments objet . Il y a même une note spécifique (18 a) indiquant que " Les fonctions fléchées n'ont jamais d'arguments. ".

43
Bergi

Comme l'a noté Bergi, les fonctions fléchées n'ont pas leur propre variable arguments.

Cependant, si vous souhaitez capturer les arguments de votre fonction flèche, vous pouvez simplement utiliser un paramètre rest

const myFunc = (...args) =>
  console.log ("arguments", args)
  
myFunc (1, 2, 3)
// arguments [1, 2, 3]

Les paramètres de repos peuvent être combinés avec d'autres paramètres de position, mais doivent toujours être inclus en tant que dernier paramètre

const myFunc = (a, b, c, ...rest) =>
  console.log (a, b, c, rest)

myFunc (1, 2, 3, 4, 5, 6, 7)
// 1 2 3 [ 4, 5, 6, 7 ]

Si vous faites l'erreur d'écrire un paramètre de repos dans toute autre position, vous obtiendrez une erreur

const myFunc = (...rest, a, b, c) =>
  console.log (a, b, c, rest)
  
myFunc (1, 2, 3, 4, 5, 6, 7)
// Error: Rest parameter must be last formal parameter
41
Thank you