2
votes

Pourquoi un IIFE ne peut-il pas être utilisé avec le style de Douglas Crockford lorsque je le réécris avec une fonction fléchée?

J'ai un IIFE qui fonctionne, mais quand je le réécris en utilisant une fonction fléchée, cela ne fonctionne pas!

1.- Celui-ci fonctionne très bien:

((n) => {
  while (n--)
    console.log("n only", n);
})(j);

2.- Celui-ci ne fonctionne pas !:

((n) => {
  while (n--)
    console.log("n only", n);
}(j));

3.- J'ai déjà testé la prochaine version qui fonctionne aussi:

let j = 3;

(function (n) {
  while (n--)
    console.log("n only", n);
}(j));


3 commentaires

Il semble que la fonction de flèche doit être entourée de () s pour être entièrement analysée comme une expression d'abord, ou quelque chose du genre, alors que les fonctions ne le font pas


Très lié: stackoverflow.com/questions/34589488/… < / a>


@CertainPerformance, c'était une petite faute de frappe dans le nº1, ça a été corrigé. Merci


3 Réponses :



3
votes

Voici comment le langage l'a défini. Comme mdn déclare:

Bien que la flèche dans une fonction de flèche ne soit pas un opérateur, les fonctions de flèche ont des règles d'analyse spéciales qui interagissent différemment avec la priorité des opérateurs par rapport aux fonctions normales.

Il continue de donner un autre exemple, mais le principe est le même:

(function (n) => {
  while (n--)
    console.log("n only", n);
})(j);

Bien que Crockford ait exprimé une préférence pour mettre la parenthèse fermante d'un IIFE à la toute fin (après les arguments), je trouve personnellement plus intuitif de le mettre au même endroit que celui où il est requis pour la flèche fonctions (après l'accolade fermante, avant les arguments).

La raison en est que le but des parenthèses est de transformer une fonction en une expression de fonction et donc les arguments ne sont vraiment pas pas important dans cette conversion. Donc, cela semble juste plus pertinent:

let callback;

callback = callback || function() {}; // ok

callback = callback || () => {};
// SyntaxError: invalid arrow-function arguments

callback = callback || (() => {});    // ok


1 commentaires

Je préfère également utiliser des parenthèses entourant les fonctions avant les arguments, cela donne plus de sens d'un point de vue mathématique. Si j'avais suivi cette préférence depuis le début, je n'aurais jamais rencontré ce problème.



1
votes

2 commentaires

La grammaire de la fonction de flèche par rapport à la fonction semble un peu désordonnée. La documentation sur mdn dit que "[...] la flèche dans une fonction de flèche n'est pas un opérateur", et en même temps, une fonction de flèche est une AssignmentExpression !! ??


C’est en fait OK. Ne confondez pas "AssignmentExpression" avec un devoir réel. Il s’agit simplement d’un symbole non terminal qui décrit les règles relatives à la langue. Chaque expression est fondamentalement une «AssingmentExpression». Si vous pensez à la grammaire décrivant un arbre, AssignmentExpression se trouve presque en haut. 5 est également une expression d'affectation.