2012-09-08 19 views
8

Si intento ejecutar una secuencia de comandos cuya línea de base sólo es un objeto:¿Por qué una función anónima en sí misma es un error de sintaxis en javascript?

{prop:'value'} 

se analiza bien (tanto en V8 y UglifyJS). De forma similar, puedo poner una cadena o un número en sí mismo como código fuente y no hay ningún error de sintaxis reportado.

Sin embargo, tanto V8 y UglifyJS se quejan de esto por sí solo:

function(){} 

me sale Uncaught SyntaxError: Unexpected token (.

¿Por qué se rompe esto cuando el objeto en el primer ejemplo está bien? ¿Las funciones no son solo objetos en javascript?

Soy consciente de que declarar una función anónima sin ejecutarla no hará nada; esa no es la pregunta. Quiero saber por qué causa un error de análisis.

+0

Bueno, le falta un nombre de función ya que declarar una función sigue la regla 'function [name]() {[code]}' así que la pregunta real podría ser: ¿Por qué hay circunstancias especiales donde puede crear una función anónima? – yoshi

+0

Una "función anónima" es más correctamente una expresión de función sin el nombre opcional (ver [FunctionExpression] (http://ecma-international.org/ecma-262/5.1/#sec-A.5)). – RobG

+0

lo que es interesante solo agrega un operador y esto funciona :) '! Function() {}; + function() {};' – abuduba

Respuesta

11

De la especificación de ECMAScript, sección 12.4 en los estados de expresión:

Tenga en cuenta que una ExpressionStatement no puede comenzar con una llave de apertura porque eso podría hacer que sea ambigua con un bloque . Además, un ExpressionStatement no puede comenzar con la palabra clave function porque podría hacerlo ambiguo con una FunctionDeclaration.

Aunque las funciones son solo objetos, recuerde que puede declarar las funciones por sí mismo sin realmente utilizar sus objetos en expresiones. Ahí es donde radica la ambigüedad. Por supuesto, nunca se puede declarar una función anónima por sí sola (ya que no se podrá hacer referencia a ella de todos modos), pero como no puedo encontrar nada en la especificación que distinga entre la función anónima y las declaraciones de función nombradas, sospecho que esto se aplica a ambos.

Con el fin de resolver la ambigüedad que necesita para envolverlo en paréntesis, por lo que siempre será tratado como una expresión:

(function(){}) 
+0

Tienes razón, el ajuste entre paréntesis funciona. Sin embargo, no veo cómo 'function() {}' es ambiguo. ¿Qué más podría significar? – Flash

+2

@ Andrew: sería ambiguo porque podría ser una expresión de función. Tenga en cuenta que las declaraciones de funciones se procesan antes de ejecutar cualquier código, las expresiones de función se procesan después de eso cuando se ejecuta el código. – RobG

+0

@RobG ¿Quieres decir que podría ser una declaración de función? ¿Cómo puede ser? No tiene nombre. – Flash

5

{prop:'value'} no se analiza como un objeto, se acaba de analizar como un bloque, el cual tiene una etiqueta prop.

Necesita () para encerrarlo en el análisis como una expresión.

({prop: 'value'}) se analizará como una expresión de objeto.

(function(){}) se analizará como una expresión de función.

Cuestiones relacionadas