¿Por qué es posible llamar a la función en JavaScript de esta manera, probado con node.js:
~$ node
> function hi() { console.log("Hello, World!"); };
undefined
> hi
[Function: hi]
> hi()
Hello, World!
undefined
> hi)( // WTF?
Hello, World!
undefined
>
¿Por qué funciona la última llamada hi)(
? ¿Es un error en node.js, un error en el motor V8, un comportamiento oficialmente indefinido o un JavaScript realmente válido para todos los intérpretes?
javascript
node.js
syntax
Hyde
fuente
fuente
.js
causará un error de sintaxisperl -ne '$x += $_; }{ print $x'
. Ver características ocultas de PerlRespuestas:
Parece ser un error de Node REPL, poner estas dos líneas en un
.js
causará un error de sintaxis.Error:
Problema enviado # 6634 .
Reproducido en v0.10.20.
v0.11.7 tiene esto arreglado.
fuente
function a)arg1, arg2( } ]arg2 + arg1[ return; {
debería ser una sintaxis válida?npm
tieneinstall
yisntall
. apuesto a que no lo has notado :)Se debe a cómo REPL evalúa la entrada, que en última instancia es como:
Los paréntesis adicionales se agregan para forzarlo a ser una Expresión :
La intención es tratar
{...}
comoObject
literales / inicializadores en lugar de como un bloque .Y, como mencionó leesei, esto se ha cambiado para 0.11.x, que solo ajustará en
{ ... }
lugar de toda la entrada:fuente
hi)(arg
funcionará? Se podría abusar de eso para escribir un código realmente lleno de WTF ;-)hi)(arg
se convierte en(hi)(arg)
- nada sin igualSe produjo un error hace 4 meses, para este problema https://github.com/joyent/node/issues/5698
Y el problema fue porque, REPL incluye las declaraciones con los padres. Entonces
se convierte
La explicación real se puede encontrar aquí https://github.com/joyent/node/issues/5698#issuecomment-19487718 .
fuente