Mengapa mungkin memanggil fungsi dalam JavaScript seperti ini, diuji dengan node.js:
~$ node
> function hi() { console.log("Hello, World!"); };
undefined
> hi
[Function: hi]
> hi()
Hello, World!
undefined
> hi)( // WTF?
Hello, World!
undefined
>
Mengapa panggilan terakhir hi)(
, bekerja? Apakah itu bug di node.js, bug di mesin V8, perilaku resmi yang tidak terdefinisi, atau JavaScript yang benar-benar valid untuk semua penerjemah?
javascript
node.js
syntax
Hyde
sumber
sumber
.js
akan menyebabkan kesalahan sintaksisperl -ne '$x += $_; }{ print $x'
. Lihat fitur Tersembunyi dari PerlJawaban:
Tampaknya bug Node REPL, menempatkan dua baris ini dalam
.js
akan menyebabkan kesalahan sintaksis.Kesalahan:
Masalah yang disampaikan # 6634 .
Direproduksi pada v0.10.20.
v0.11.7 memperbaiki ini.
sumber
function a)arg1, arg2( } ]arg2 + arg1[ return; {
seharusnya sintaks yang valid?npm
sudahinstall
danisntall
. yakin Anda belum menyadarinya :)Itu karena bagaimana REPL mengevaluasi input, yang pada akhirnya adalah:
Tanda kurung tambahan ditambahkan untuk memaksanya menjadi Ekspresi :
Tujuannya adalah untuk memperlakukan
{...}
sebagaiObject
literal / inisialisasi daripada sebagai blok .Dan, seperti yang disebutkan leesei, ini telah diubah untuk 0.11.x, yang hanya akan membungkus
{ ... }
daripada semua input:sumber
hi)(arg
akan berhasil? Itu bisa disalahgunakan untuk menulis beberapa kode yang benar-benar dikendarai WTF ;-)hi)(arg
menjadi(hi)(arg)
- tidak ada yang tak tertandingiAda bug yang muncul 4 bulan lalu, untuk masalah ini https://github.com/joyent/node/issues/5698
Dan masalahnya adalah karena, REPL melampirkan pernyataan dengan parens. Begitu
menjadi
Penjelasan aktual dapat ditemukan di sini https://github.com/joyent/node/issues/5698#issuecomment-19487718 .
sumber