Lihat kode berikut:
Salinan kode adalah sebagai berikut:
if (! ("aa" di jendela)) {
waspada ('oh my god');
var aa = 1;
}
alert ("aa" di jendela);
peringatan (AA);
Jawab pertanyaan berikut:
Akankah kesalahan dilaporkan? Berapa kali akan muncul?
Apakah peringatan kedua benar atau salah?
Apa yang muncul di peringatan ketiga?
Mengapa?
Pikirkan tentang itu, dan kemudian mengujinya. Jika Anda menjawab dengan benar, Anda tidak perlu membaca artikel berikut.
-----------------------------
Mendefinisikan variabel dalam JS terlalu sederhana. Anda bisa menggunakan var, atau bahkan tanpa var:
Salinan kode adalah sebagai berikut:
var a = 1;
Di sini A adalah nama variabel dan 1 adalah nilai variabel. Sayangnya, ini terlalu mendasar. Lihat kode berikut:
Salinan kode adalah sebagai berikut:
var a;
waspada (a);
Dalam tes Firebug, tidak terdefinisi akan muncul. Ini adalah string yang sangat akrab, yang tampaknya menunjukkan bahwa variabel tidak ditentukan. Tapi saya pikir saya sudah beragam, ini adalah definisi, tetapi tidak ada nilai yang melekat.
Mari kita lakukan sesuatu yang benar -benar tidak terdefinisi:
Salinan kode adalah sebagai berikut:
waspada (a);
Itu benar, cukup beri tahu variabel yang tidak pernah muncul sama sekali. Apa yang akan terjadi?
Firebug secara langsung melaporkan kesalahan: A tidak didefinisikan. Itu berarti bahwa A tidak didefinisikan. Menggabungkan kode sebelumnya, ini membingungkan. Apa perbedaan antara yang tidak terdefinisi dan sebelumnya tidak ditentukan?
Faktanya, kode sebelumnya setara dengan ini:
Salinan kode adalah sebagai berikut:
var a = tidak terdefinisi;
waspada (a);
Dengan kata lain, ketika suatu variabel dideklarasikan tanpa menetapkan nilai, JS akan memberikan nilai yang tidak terdefinisi ke variabel. Perhatikan bahwa ini adalah "nilai", yang berarti bahwa A sudah memiliki nilai, dan nilai ini disebut "tidak ditentukan".
Variabel di balik peringatan langsung tidak pernah muncul, yang berarti bahwa ini adalah yang sebenarnya tidak terdefinisi.
Sederhananya: Tidak ada variabel tanpa nilai di JS, dan nilainya ditetapkan ketika variabel dinyatakan.
Lalu kita melihat kode berikut:
Salinan kode adalah sebagai berikut:
waspada (a);
var a = 1;
Apakah kode ini akan melaporkan kesalahan? Karena ketika peringatan waspada, variabel A belum muncul.
Tetapi tidak ada kesalahan dengan cara ini, tetapi nilai yang tidak terdefinisi muncul. Ini menunjukkan bahwa variabel A sudah ada, tetapi nilainya bukan yang kita inginkan, tetapi tidak terdefinisi. Apa masalahnya?
Karena deklarasi variabel var sama dengan deklarasi fungsi, itu akan dimajukan, pada kenyataannya, kode di atas terlihat seperti ini:
Salinan kode adalah sebagai berikut:
var a;
waspada (a);
a = 1;
Dengan cara ini Anda akan mengerti.
Oleh karena itu, kunci dari masalah ini adalah: Deklarasi VAR akan mencapai bagian atas ruang lingkup terlebih dahulu, tetapi nilai yang terlampir tidak akan - pengaturan yang sangat kusut, saya tidak tahu mengapa saya melakukan ini. Saya pribadi berpikir ini adalah cacat JS.
Ada kebiasaan kode sekarang yang para pendukung menempatkan deklarasi variabel di depan ruang lingkup, mungkin mempertimbangkan ini - bahkan jika Anda tidak menulisnya di depan, JS akan maju terlebih dahulu.
Sekarang izinkan saya merilis jawaban untuk pertanyaan di awal artikel:
Hanya dua peringatan yang akan muncul, dan peringatan di IF tidak akan dieksekusi, karena deklarasi VAR maju, kode sebenarnya terlihat seperti ini:
Salinan kode adalah sebagai berikut:
var aa;
if (! ("aa" di jendela)) {
waspada ('oh my god');
aa = 1;
}
alert ("aa" di jendela);
peringatan (AA);
Meskipun AA kosong, itu akan benar ketika dinilai oleh 'AA' di jendela, karena A memang ada dan nilainya tidak terdefinisi. Jadi jika kode tidak akan dieksekusi. Saya tidak akan berbicara tentang dua peringatan terakhir.
Secara pribadi, saya merasa bahwa ini adalah pertanyaan yang sangat tidak masuk akal. Kita harus memahami alasannya, tetapi membencinya sebagai jebakan.
Pertanyaan di atas juga merupakan alasan mengapa saya menulis artikel ini. Saya melihat kode ini dari artikel online, tetapi tidak ada jawaban di dalamnya. Saya tidak bisa memukuli saudara perempuan saya, jadi saya pergi ke Stackoverflow dan meminta untuk mengetahuinya. Jawabannya adalah artikel ini.
Tapi ini adalah pertanyaan yang sangat mendasar, sebenarnya! Lai Lai
Haha, maafkan aku, ada pertanyaan lain:
Salinan kode adalah sebagai berikut:
var b = {}
peringatan (b.aa);
peringatan (b.aa.bb);
Ini juga merupakan cara untuk mendeklarasikan variabel. Jadi, akankah kode ini melaporkan kesalahan? Mengapa?