Je viens de lire l'article de Ben Alman sur Immediately-Invoked Function Expressions et se sont interrogés sur cette partie, où il l'introduction d'expressions de la fonction et les fermetures (pas vraiment liés encore IIFEs):Pourquoi existe-t-il deux syntaxes différentes pour appeler des expressions de fonction anonymes?
// ...doesn't it stand to reason that the function expression itself can // be invoked, just by putting() after it? function(){ /* code goes here */ }(); // This works! Well, almost. A minor JavaScript syntax issue actually // requires that ambiguity between function declarations and function // expressions be eliminated, which can be done by wrapping the function // expression in parens. // The following pattern is used universally to create an anonymous // closure with "privacy": (function(){ /* code goes here */ })(); // This parens syntax is also valid (I prefer the previous version): (function(){ /* code goes here */ }());
Cette dernière partie m'a frappé. Quelqu'un peut-il expliquer pourquoi il existe deux versions syntaxiques différentes pour invoquer des expressions de fonction?
Était-ce la syntaxe introduit consciemment juste pour appeler les fermetures anonymes? Ou est-ce un sous-produit d'une autre propriété syntaxique?
Pourquoi la deuxième version fonctionne de toute façon? Le premier a un sens pour moi du point de vue de l'analyseur. La première paire de parens évalue un objet fonction, la deuxième paire invoque cet objet fonction. Mais le second? Cela ne semble pas résoudre l'ambiguïté syntaxique mentionnée.
Quelqu'un peut-il me dire ce qui me manque ici?
Excellente réponse. Juste ce que je cherchais (mais je ne pouvais pas penser à moi-même). :) Merci! –