Alasan Anda melihat masalah seperti ini adalah konsol itu sendiri mencoba meniru lingkup global konteks yang saat ini Anda targetkan. Itu juga mencoba untuk menangkap nilai kembali dari pernyataan dan ekspresi yang Anda tulis di konsol, sehingga muncul sebagai hasil. Ambil, misalnya:
> 3 + 2
< 5
Di sini, dieksekusi seolah-olah itu ekspresi, tetapi Anda telah menulis seolah-olah itu adalah pernyataan. Dalam skrip normal, nilainya akan dibuang, tetapi di sini, kodenya harus secara internal hancur (seperti membungkus seluruh pernyataan dengan konteks fungsi dan return
pernyataan), yang menyebabkan segala macam efek aneh, termasuk masalah yang Anda alami.
Ini juga salah satu alasan mengapa beberapa kode ES6 telanjang dalam skrip berfungsi dengan baik tetapi tidak di konsol Alat Dev Chrome.
Coba jalankan ini di Node dan konsol Chrome:
{ let a = 3 }
Di Node atau <script>
tag berfungsi dengan baik, tetapi di konsol, itu memberi Uncaught SyntaxError: Unexpected identifier
. Ini juga memberi Anda tautan ke sumber dalam bentuk VMxxx:1
yang dapat Anda klik untuk memeriksa sumber yang dievaluasi, yang muncul sebagai:
({ let a = 3 })
Jadi mengapa ia melakukan ini?
Jawabannya adalah perlu mengubah kode Anda menjadi ekspresi sehingga hasilnya dapat dikembalikan ke pemanggil dan ditampilkan di konsol. Anda dapat melakukan ini dengan membungkus pernyataan dalam tanda kurung, yang membuatnya menjadi ekspresi, tetapi juga membuat blok di atas secara sintaksis salah (ekspresi tidak dapat memiliki deklarasi blok).
Konsol mencoba memperbaiki kasus tepi ini dengan menjadi pandai tentang kode, tapi itu di luar cakupan jawaban ini, saya pikir. Anda dapat mengajukan bug untuk melihat apakah itu sesuatu yang mereka pertimbangkan untuk memperbaikinya.
Berikut ini contoh bagus dari sesuatu yang sangat mirip:
https://stackoverflow.com/a/28431346/46588
Cara paling aman untuk membuat kode Anda berfungsi adalah memastikan kode itu dapat dijalankan sebagai ekspresi dan memeriksa SyntaxError
tautan sumber untuk melihat apa kode eksekusi yang sebenarnya dan merekayasa balik solusi dari itu. Biasanya itu berarti sepasang kurung yang ditempatkan secara strategis.
Singkatnya: konsol mencoba untuk meniru konteks eksekusi global seakurat mungkin, tetapi karena keterbatasan interaksi dengan mesin v8 dan semantik JavaScript, terkadang ini sulit atau tidak mungkin untuk dipecahkan.