Pour implémenter un minuscule compilateur qui émet ECMAScript, j'ai besoin de savoir à quel point une expression d'objet fonction est forte, c'est-à-dire quelle est la priorité de l'opérateur function(a1, a2, ...) { ... }
? Par exemple, comment function(a1, a2, ...) { ... } (b1, b2, ...)
est-il supposé être analysé? Pour obtenir le résultat souhaité, à savoir l'application de b1, b2, ... à l'objet fonction, je dois utiliser des parenthèses autour de l'objet fonction dans l'interpréteur Rhino.Préséance de l'expression de l'objet fonction dans ECMAScript
Répondre
Votre function(a1, a2, ...) { ... } (b1, b2, ...)
n'est pas valide et doit renvoyer une erreur de syntaxe. ECMAScript a le concept d'un FunctionDeclaration
ainsi que celui d'un FunctionExpression
. Vous pouvez consulter les éléments suivants:
- Function expressions vs. Function declarations
- Explain JavaScript's encapsulated anonymous function syntax (@CMS' answer)
Alors qu'un FunctionExpression
est un opérateur, la FunctionDeclaration
est une syntaxe particulière utilisée pour déclarer les fonctions, qui sont automatiquement hissé au sommet de la portée englobante.
Envelopper un function
dans le grouping operator (parenthèse) forcera l'interpréteur à le traiter comme FunctionExpression
.
Si vous essayez ce qui suit dans Firebug:
function() { alert('test'); }(); // Syntax Error
(function() { alert('test'); })(); // Works fine
Pour exécuter une fonction littérale, il doit être mis entre parenthèses. Soit:
(function(...){...})(...);
ou:
(function(...){...}(...));
Sans les parenthèses, il produit une erreur de syntaxe.
Il suffit de faire une valeur r. Ainsi, '! Funcion() {...}' fonctionne aussi. – Pointy
Merci beaucoup! Votre réponse était exactement ce que je cherchais. (En fait, il me semble que cette fonctionnalité particulière d'ECMAScript n'a pas été bien pensée.) – Marc
@ Marc: Oui, je suis d'accord. Les expressions de fonction auraient dû être suffisantes. Il y a beaucoup de situations où les déclarations de fonction sont confuses dans cette langue ... Ce sujet a été discuté récemment dans un autre message de Stack Overflow: http://stackoverflow.com/questions/3798984/whats-going-on-in-javascript-when- i-use-the-traditionnel-c-style-function-decla –