¿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

.jscausará 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
.jscausará 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?npmtieneinstallyisntall. 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
{...}comoObjectliterales / 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)(argfuncionará? Se podría abusar de eso para escribir un código realmente lleno de WTF ;-)hi)(argse 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