Estoy leyendo un libro de JavaScript y he estado ejecutando ejemplos de código usando Node.js. He estado escribiendo archivos y luego ejecuté node file.js.

Normalmente, uso punto y coma escribiendo JavaScript, pero sigo el estilo del libro.

Me encontré con un error al ejecutar uno de los ejemplos de código, y no puedo entender por qué sucede.

Ejecutando:

var x = 2
var y = 3
(x == 2) && (y == 3)
(x > 3) || (y < 3)

Resultados en el error:

TypeError: 3 is not a function

Si agrego un ; después de la línea 2, p.

var x = 2
var y = 3;
(x == 2) && (y == 3)
(x > 3) || (y < 3)

Resulta en el error:

TypeError: (y == 3) is not a function

Sin embargo, si coloco un ; también después de la tercera línea, p.

var x = 2
var y = 3;
(x == 2) && (y == 3);
(x > 3) || (y < 3)

Las cosas funcionan bien.

O si ejecuto cada línea (individualmente) en la línea de comando Node.js, todo funciona bien.

Probablemente sea solo mi malentendido de Node.js o JavaScript. Pero no pude encontrar otra situación similar en línea.

Estoy usando OS X 10.11.1 y Node.js v5.2.0 (instalado a través de Homebrew).

1
erratum 11 dic. 2015 a las 04:12

4 respuestas

La mejor respuesta

Esto sucedería en cualquier entorno de JavaScript, no solo en el nodo. Existen reglas específicas sobre cuándo se pueden omitir los punto y coma. Esta es la razón por la mayoría si la comunidad aboga contra la omisión de punto y coma.

Esto se está ejecutando como una sola declaración:

var y = 3
(x == 2) && (y == 3)
(x > 3) || (y < 3)

Las declaraciones están delineadas por contexto (o punto y coma), no por espacios en blanco o líneas nuevas.

var y = parseInt('10px');

Es lo mismo que

var y = parseInt
('10px');

Es lo mismo que

var y = parseInt             ('10px');

Entonces, cuando intenta ejecutar var y = 3 (x == 2), el JIT está interpretando 3 como una función, debido al paréntesis que lo sigue.

3
Jack 11 dic. 2015 a las 01:21

Si la siguiente línea comienza con un '(', entonces la declaración no termina con una nueva línea. Por lo tanto, necesita un ';' o algún otro token para especificar que la declaración ha terminado.

Puede leer más sobre javascript y punto y coma aquí y aquí.


Su primer error ocurre porque el código se está interrumpiendo como:

var y = 3(x == 2)

El segundo error si el código se interrumpe como:

(y == 3)(x > 3)

Estos no son válidos


Agregar el punto y coma cambia su código a

var y = 3;(x == 2)

Y

(y == 3);(x > 3)

Estos son validos.


2
Jekrb 11 dic. 2015 a las 01:24

Javascript usa el punto y coma y no la nueva línea para denotar el final de una declaración y el posible comienzo de otra. Entonces, cuando intentaste ejecutar:

var x = 2
var y = 3
(x == 2) && (y == 3)
(x > 3) || (y < 3)

Lo interpretó como:

var x = 2 var y = 3(x==2) && (y==3)(x > 3) || (y<3)

Parecía que intentabas inicializar y con el valor de la función 3(x=2), que es una sintaxis y una semántica incorrecta para una declaración de función en javascript.

Cuando colocas un punto y coma después de la segunda línea, interpreta las líneas 1 y 2 como quieres que se interpreten, pero nuevamente surgió un problema similar en las líneas 3 y 4, que se solucionaron una vez que agregaste los puntos y coma.

Solo necesita punto y coma donde javascript no puede indicar el final de una declaración y el comienzo de otra. Puede omitirlos, pero la regla general es algo como esto.

2
Nikhil Saldanha 11 dic. 2015 a las 01:25

Como puede ver aquí,

La fuente

a = b + c

(d + e).print()

no se transforma mediante la inserción automática de punto y coma, porque la expresión entre paréntesis que comienza la segunda línea se puede interpretar como una lista de argumentos para una llamada de función:

a = b +c(d + e).print()

En la circunstancia de que una declaración de asignación debe comenzar con un paréntesis izquierdo, es una buena idea que el programador proporcione un punto y coma explícito al final de la declaración anterior en lugar de confiar en la inserción automática de punto y coma.

Es un error conocido cuando se codifica sin punto y coma en JavaScript y eso también se comporta igual para Node.js.

1
Gökay Gürcan 11 dic. 2015 a las 01:26
34214629