Lihat kod di bawah:
Adakah ralat akan dilaporkan? Berapa kali ia akan muncul?
Adakah makluman kedua benar atau palsu?
Apa yang muncul dalam amaran ketiga?
kenapa?
Fikirkannya dan kemudian ujinya Jika anda menjawabnya dengan betul, anda tidak perlu membaca artikel berikut.
Terlalu mudah untuk menentukan pembolehubah dalam JS, hanya gunakan var, atau pun tanpa var:
Firebug secara langsung melaporkan ralat: a tidak ditakrifkan. Ini bermakna a tidak ditakrifkan. Ini mengelirukan apabila digabungkan dengan kod sebelumnya. Apakah perbezaan antara undefined ini dan undefined sebelumnya?
Malah, kod sebelumnya adalah bersamaan dengan ini:
Dalam amaran langsung berikut, pembolehubah tidak pernah muncul, yang bermaksud bahawa ini benar-benar tidak ditentukan.
Ringkasnya: tiada pembolehubah tanpa nilai dalam JS, pembolehubah diberikan nilai apabila ia diisytiharkan.
Kemudian mari kita lihat kod berikut:
Tetapi dengan cara ini, tiada ralat dilaporkan, tetapi nilai yang tidak ditentukan muncul. Ia menunjukkan bahawa pembolehubah a sudah wujud, tetapi nilainya bukanlah apa yang kita mahu, tetapi tidak ditentukan. Apakah masalah ini?
Oleh kerana pengisytiharan pembolehubah var adalah sama dengan pengisytiharan fungsi, ia akan dimajukan Sebenarnya, kod di atas adalah seperti ini:
Jadi, kunci kepada masalah ini ialah: pernyataan var akan maju ke bahagian atas skop, tetapi nilai yang dilampirkan tidak akan - tetapan yang sangat mengelirukan, saya tidak tahu mengapa ia dilakukan dengan cara ini. Secara peribadi, saya fikir ini adalah kecacatan JS.
Pada masa kini, terdapat tabiat pengekodan yang menyokong meletakkan pengisytiharan berubah-ubah di hadapan skop Ini mungkin kerana ini - bagaimanapun, walaupun anda tidak menulisnya di hadapan, JS akan pergi ke hadapan dalam. terlebih dahulu.
Sekarang lepaskan jawapan kepada soalan pada permulaan artikel:
Hanya dua makluman akan muncul, dan makluman di dalam if tidak akan dilaksanakan Kerana sifat awal perisytiharan var, kod sebenar kelihatan seperti ini:
Secara peribadi, saya fikir ini adalah soalan yang tidak masuk akal. Kita harus memahami alasannya, tetapi menghina perangkapnya.
Soalan di atas juga merupakan sebab saya menulis artikel ini daripada artikel dalam talian, tetapi tiada jawapan di dalamnya, jadi saya pergi ke stackoverflow untuk bertanya keluar. Jawapannya ialah artikel ini.
Tetapi ini adalah soalan yang sangat asas sebenarnya! ! !
Haha, maafkan saya, nanti ada soalan lagi: