2009-10-11 18 views
8

¿Por qué esto causa un error de sintaxis de la instrucción de retorno:JavaScript Error de sintaxis

var FOO = (function($) 
{ 
    return 
    {  
     init: function() 
     { 

     } 
    } 
})(jQuery); 

Mientras que esto no:

var FOO = (function($) 
{ 
    return {  
     init: function() 
     { 

     } 
    } 
})(jQuery); 

¿Por qué hay una diferencia?

+0

posible duplicado de [¿Cuáles son las reglas para la inserción automática de punto y coma de Javascript (ASI)?] (Http://stackoverflow.com/q/2846283/1048572) – Bergi

+0

@Bergi técnicamente esa pregunta sería un duplicado de esta, desde que llegó primero;) Pero el énfasis y la "capacidad de búsqueda" son diferentes (por ejemplo, no quiero que se elimine esta pregunta) – drzaus

+0

@drzaus: los cierres duplicados no necesitan seguir estrictamente un orden temporal; tenemos muchas preguntas canónicas que fueron más tarde, pero con respuestas de mayor calidad :-) Tenga en cuenta que solo quería vincular esa publicación relacionada y muy relevante (no es un engaño exacto), no cerré esta pregunta (vote para cerrarla). Además, las preguntas cerradas no se eliminan. – Bergi

Respuesta

21

No se trata de espacios en blanco, se trata de inserción automática de punto y coma por JavaScript.

especificación ECMAScript dice

Algunas de las declaraciones de ECMAScript (vacío declaración, declaración de variables, declaración de la expresión, do-while declaración, sentencia continue, romper declaración, sentencia de retorno, y tirar declaración) debe terminar con punto y coma. Tales puntos y comas siempre pueden aparecer de forma explícita en el texto fuente. Para mayor comodidad, sin embargo, tales puntos y comas pueden omitirse del texto de origen en ciertas situaciones. Estas situaciones están descritas por diciendo que los puntos y comas son que se insertan automáticamente en la fuente del código fuente en esas situaciones.

Esto significa que el código

var FOO = (function($) 
{ 
    return 
    {  
     init: function() 
     { 

     } 
    } 
})(jQuery); 

se traduce como

var FOO = (function($) 
{ 
    return; // <- JavaScript will insert a semicolon here. 

    {  
     init: function() 
     { 

     } 
    } 
})(jQuery); 

Así FOO será indefinido después de que se ejecute la función.

Para su otro código, JS no insertará ningún punto y coma y funcionará correctamente JS insertará punto y coma después de su objeto literal y debería funcionar bien. [EDITAR: Corrección según lo señalado por kagnax]

Esto significa que siempre debe terminar sus declaraciones con punto y coma. Dejar que el motor de JS inserte un punto y coma puede introducir errores muy sutiles, lo que llevaría horas depurar. Puede usar una herramienta como JSLint que le avisará si falta el punto y coma.

+3

En realidad, para su "otro código" JS ** ** insertará el punto y coma, pero solo después del literal del objeto, como se explica en la sección de especificaciones que citó - * ReturnStatement * s son candidatos para ASI :) – kangax

+0

kangax, no noté que a su otro literal también le faltaba un punto y coma. Actualizaré la respuesta. – SolutionYogi

+0

Un poco de conveniencia, ¿eh? No me di cuenta de que Javascript se metía con mi código haciendo modificaciones sutiles pero profundas. No quiero esta "conveniencia". +1 para la explicación de tomados a básicos – mfeingold