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).
4 respuestas
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.
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.
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.
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.
Preguntas relacionadas
Nuevas preguntas
javascript
Para preguntas sobre la programación en ECMAScript (JavaScript / JS) y sus diversos dialectos / implementaciones (excepto ActionScript). Incluya todas las etiquetas relevantes en su pregunta; por ejemplo, [node.js], [jquery], [json], etc.