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 Réponses :
Les deux fonctionnent, mais vous avez fait une faute de frappe: assurez-vous d'écrire (
let a = 3; ((b) => { while(b--) console.log(b); })(a); (function(b){ while(b--) console.log(b); })(a);
À peu près sûr, l'incohérence que pose OP est que la fonction
n'a pas besoin d'être entourée de ()
s, tandis que la fonction de flèche fait .
Je ne pense pas que vous ayez compris la question.
Pour ma défense, la question est un peu floue ... Je n'ai pas voté contre, mais le contenu de ceci a > reflète ma réaction à la question
Il existe de nombreuses façons de poser une question. Dans ce cas, je pourrais poser des questions sur l'incohérence à laquelle CertainPerformance fait référence
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
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.
Ce qui est et ce qui n'est pas une syntaxe valide est déterminé par le langage grammaire a >. Une Mais une Pourquoi c'est le cas serait une question pour le comité TC39. CallExpression
est définie comme MemberExpression Arguments
ArrowFunction
n'est pas une MemberExpression , c'est une
AssignmentExpression
.
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.
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 lesfonctions
ne le font pasTrès lié: stackoverflow.com/questions/34589488/… < / a>
@CertainPerformance, c'était une petite faute de frappe dans le nº1, ça a été corrigé. Merci