2010-10-02 2 views
2

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

4

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:

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 
+0

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

+1

@ 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 –

0

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.

+1

Il suffit de faire une valeur r. Ainsi, '! Funcion() {...}' fonctionne aussi. – Pointy

Questions connexes