Por que é possível chamar a função em JavaScript assim, testada com node.js:
~$ node
> function hi() { console.log("Hello, World!"); };
undefined
> hi
[Function: hi]
> hi()
Hello, World!
undefined
> hi)( // WTF?
Hello, World!
undefined
>
Por que a última ligação hi)(
funciona? É bug no node.js, bug no mecanismo V8, comportamento oficialmente indefinido ou JavaScript realmente válido para todos os intérpretes?
javascript
node.js
syntax
hyde
fonte
fonte
.js
causará erro de sintaxeperl -ne '$x += $_; }{ print $x'
. Veja Recursos ocultos do PerlRespostas:
Parece ser um bug do Node REPL, colocar essas duas linhas em
.js
causará um erro de sintaxe.Erro:
Edição enviada # 6634 .
Reproduzido em v0.10.20.
v0.11.7 corrigiu isso.
fonte
function a)arg1, arg2( } ]arg2 + arg1[ return; {
deve ser uma sintaxe válida?npm
teminstall
eisntall
. aposto que você não tenha notado :)Isso se deve à maneira como o REPL avalia a entrada, que é basicamente:
Os parênteses adicionais são adicionados para forçá-lo a ser uma expressão :
A intenção é tratar
{...}
comoObject
literais / inicializadores, e não como um bloco .E, como leesei mencionou, isso foi alterado para 0.11.x, que irá apenas
{ ... }
agrupar em vez de todas as entradas:fonte
hi)(arg
vai funcionar? Isso poderia ser abusado para escrever algum código verdadeiramente WTF-montado ;-)hi)(arg
torna-se(hi)(arg)
- nada inigualávelHouve um erro levantado quatro meses atrás, para este problema https://github.com/joyent/node/issues/5698
E o problema foi porque, o REPL encerra as instruções com parênteses. assim
torna-se
A explicação real pode ser encontrada aqui https://github.com/joyent/node/issues/5698#issuecomment-19487718 .
fonte