Rumah  >  Artikel  >  hujung hadapan web  >  Perbincangan tentang mentakrifkan pembolehubah dan isu keutamaan pembolehubah dalam kemahiran JavaScript_javascript

Perbincangan tentang mentakrifkan pembolehubah dan isu keutamaan pembolehubah dalam kemahiran JavaScript_javascript

WBOY
WBOYasal
2016-05-16 16:34:131218semak imbas

Lihat kod di bawah:

Salin kod Kod adalah seperti berikut:

jika (!("aa" dalam tetingkap)) {
alert('oh my god');
var aa = 1; }
makluman("aa" dalam tetingkap);
makluman(aa);

Jawab soalan berikut:

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:


Salin kod Kod adalah seperti berikut:
var a = 1;

Di sini a ialah nama pembolehubah, dan 1 ialah nilai pembolehubah. Malangnya, ini terlalu asas. Lihat kod di bawah:

Salin kod Kod adalah seperti berikut:
var a;
makluman(a);

Apabila diuji dengan pepijat api, undefined akan muncul Ini adalah rentetan yang semua orang biasa dengannya. Ia seolah-olah menunjukkan bahawa pembolehubah tidak ditentukan. Tetapi saya fikir, saya sudah var, ini adalah definisi, ia tidak mempunyai nilai tambah.
Mari kita lakukan sesuatu yang benar-benar tidak jelas:

Salin kod Kod adalah seperti berikut:
makluman(a);

Betul, cuma maklumkan pembolehubah yang tidak pernah muncul sama sekali.

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:

Salin kod Kod adalah seperti berikut:
var a = undefined;
makluman(a);

Maksudnya, apabila pembolehubah diisytiharkan tanpa memberikan nilai, JS akan menghantar nilai yang tidak ditentukan kepada pembolehubah Ambil perhatian bahawa ini ialah "nilai", menunjukkan bahawa nilai ini dipanggil ". tidak ditentukan".

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:

Salin kod Kod adalah seperti berikut:
makluman(a);
var a = 1;

Adakah kod ini melaporkan ralat? Kerana pembolehubah a tidak sempat muncul semasa amaran.

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:

Salin kod Kod adalah seperti berikut:
var a;
makluman(a);
a = 1;

Dengan cara ini anda akan faham.

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:

Salin kod Kod adalah seperti berikut:

var aa;
jika (!("aa" dalam tetingkap)) {
alert('oh my god');
aa = 1; }
makluman("aa" dalam tetingkap);
makluman(aa);

Walaupun aa kosong, ia akan menjadi benar apabila dinilai oleh 'aa' dalam tetingkap, kerana a memang wujud dan nilainya tidak ditentukan. Jadi kod if tidak akan dilaksanakan. Saya tidak akan bercakap tentang dua makluman terakhir.

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:


Salin kod Kod adalah seperti berikut:
var b = {}
makluman(b.aa);
makluman(b.aa.bb);

Ini juga merupakan cara untuk mengisytiharkan pembolehubah Jadi, adakah kod ini akan melaporkan ralat? kenapa?
Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn