Warum ist es möglich, Funktionen in JavaScript wie folgt aufzurufen, die mit node.js getestet wurden:
~$ node
> function hi() { console.log("Hello, World!"); };
undefined
> hi
[Function: hi]
> hi()
Hello, World!
undefined
> hi)( // WTF?
Hello, World!
undefined
>
Warum funktioniert der letzte Anruf hi)(
? Ist es ein Fehler in node.js, ein Fehler in der V8-Engine, ein offiziell undefiniertes Verhalten oder tatsächlich gültiges JavaScript für alle Interpreter?
javascript
node.js
syntax
Hyde
quelle
quelle
.js
perl -ne '$x += $_; }{ print $x'
. Siehe versteckte Funktionen von PerlAntworten:
Scheint ein Node REPL-Fehler zu sein. Wenn Sie diese beiden Zeilen in einen Fehler setzen, wird dies zu einem
.js
Syntaxfehler führen.Error:
Ausgabe eingereicht # 6634 .
Wiedergabe am v0.10.20.
v0.11.7 haben dies behoben.
quelle
function a)arg1, arg2( } ]arg2 + arg1[ return; {
sollte eine gültige Syntax sein?npm
hatinstall
undisntall
. Ich wette, du hast es nicht bemerkt :)Dies liegt daran, wie die REPL die Eingabe bewertet, was letztendlich wie folgt lautet:
Die zusätzlichen Klammern werden hinzugefügt, um zu erzwingen, dass es sich um einen Ausdruck handelt :
Die Absicht ist,
{...}
alsObject
Literale / Initialisierer und nicht als Block zu behandeln .Und wie Leesei erwähnt hat, wurde dies für 0.11.x geändert, wodurch nur
{ ... }
alle Eingaben umbrochen werden:quelle
hi)(arg
das funktionieren wird? Das könnte missbraucht werden, um einen wirklich WTF-gesteuerten Code zu schreiben ;-)hi)(arg
wird(hi)(arg)
- nichts UnübertroffenesVor 4 Monaten wurde ein Fehler für dieses Problem gemeldet: https://github.com/joyent/node/issues/5698
Und das Problem war, dass REPL die Aussagen mit Parens verbindet. So
wird
Die aktuelle Erklärung finden Sie hier https://github.com/joyent/node/issues/5698#issuecomment-19487718 .
quelle