Dlaczego możliwe jest wywołanie funkcji w JavaScript w ten sposób, przetestowany przy pomocy node.js:
~$ node
> function hi() { console.log("Hello, World!"); };
undefined
> hi
[Function: hi]
> hi()
Hello, World!
undefined
> hi)( // WTF?
Hello, World!
undefined
>
Dlaczego ostatnie połączenie hi)(
działa? Czy to błąd w node.js, błąd w silniku V8, oficjalnie niezdefiniowane zachowanie, czy faktycznie poprawny JavaScript dla wszystkich tłumaczy?
javascript
node.js
syntax
hyde
źródło
źródło
.js
spowoduje błąd składniperl -ne '$x += $_; }{ print $x'
. Zobacz Ukryte funkcje PerlaOdpowiedzi:
Wydaje się, że jest to błąd REPL węzła, umieszczenie tych dwóch wierszy
.js
spowoduje błąd składniowy.Błąd:
Zgłoszony problem # 6634 .
Reprodukcja w dniu 10.10.20.
v0.11.7 ma to naprawione.
źródło
function a)arg1, arg2( } ]arg2 + arg1[ return; {
powinna być poprawna składnia?npm
mainstall
iisntall
. założę się, że nie zauważyłeś :)Wynika to z tego, jak REPL ocenia dane wejściowe, co ostatecznie jest następujące:
Dodano dodatkowy nawias, aby zmusić go do wyrażenia :
Chodzi o to, aby traktować je
{...}
jakoObject
literały / inicjatory, a nie jak blok .I, jak wspomniano leesei, zostało to zmienione dla wersji 0.11.x, która po prostu
{ ... }
zawinie, a nie wszystkie dane wejściowe:źródło
hi)(arg
to zadziała? To może być nadużywane, aby napisać kod naprawdę oparty na WTF ;-)hi)(arg
staje się(hi)(arg)
- niczym niezrównanym4 miesiące temu zgłoszono błąd dotyczący tego problemu https://github.com/joyent/node/issues/5698
Problem polegał na tym, że REPL dołącza instrukcje do parens. Więc
staje się
Rzeczywiste wyjaśnienie można znaleźć tutaj https://github.com/joyent/node/issues/5698#issuecomment-19487718 .
źródło