Artikel ini menjelaskan pra-pengejaran JavaScript dan teknik terkait. Bagikan untuk referensi Anda, sebagai berikut:
variabel
Sekali lagi, mulailah dengan permintaan perbandingan kesalahan dari dua contoh kecil ini.
waspada (y1); // Segmen Kode 1var y1 = 'dddd'; alert (y2); // Segmen Kode 2 // Peringatan (TypeOf Y2); y2 = 'xxxxx';
Pertama -tama mari kita pikirkan mengapa satu orang tidak terdefinisi, dan yang lainnya melempar kesalahan variabel yang tidak terdefinisi. . Pertama -tama mari kita lihat proses parsing JavaScript.
Sebelum proses eksekusi, JavaScript akan melakukan acara "praparsement". Mesin parsing melakukan pembuatan semua variabel VAR pada level blok dan memberi mereka nilai awal: tidak ditentukan. Dengan cara ini, alasan mengapa contoh pertama muncul tidak terdefinisi jelas.
Jadi kode pertama sebenarnya setara dengan
var y1; waspada (typeof y1); // Secara alami, nilainya tidak terdefinikasi1 = 'dddd';
Mengapa potongan kode kedua melakukan kesalahan lagi? Itu tidak lagi termasuk dalam tahap "pra-parse" (di sini saya berasumsi bahwa browser hanya melakukan dua hal ketika menemukan tag skrip: pra-parse dan eksekusi, yang sebenarnya bukan hanya dua hal ini). Namun, pada tahap eksekusi, alasan untuk melempar kesalahan adalah bahwa JS tidak tahu keadaan Y2 dalam keadaan segmen eksekusi (tidak ada informasi Y2 yang ditangkap pada tahap pra-peluang), dan tentu saja, ia melempar informasi kesalahan yang tidak terdefinisi. Masalah lain terlibat di sini: JS adalah bahasa tipe lemah, dan variabel dapat digunakan tanpa definisi, jadi mengapa dilemparkan ke sini sebagai kesalahan definisi?
Selalu ada alasan untuk hal -hal terjadi. JavaScript selalu memiliki banyak fitur aneh, dan ada variabel yang dibaca dan ditulis tidak rata. Variabel yang tidak ditentukan hanya dapat ditulis dan tidak dapat dibaca. Apa yang bisa ditulis? Setiap orang terbiasa dengan metode penulisan ini:
y2 = 'Ujian'; // Sebelum operasi definisi muncul (mis. Sebelum tidak memiliki ruang lingkupnya sendiri), operasi ini akan mempertimbangkan kode ini untuk menentukan variabel global, mendaftarkan properti Y2 di jendela, dan menetapkannya untuk memeriksa
Tetapi ketika membacanya, mesin JS tidak dapat menemukan informasi terkait tentang hal itu, sehingga ia bertindak dengan amarahnya sendiri dan membuat kesalahan yang tidak ditentukan tanpa ragu -ragu. Ini adalah aturan permainan JS. Namun, mengapa Anda bisa mendapatkan jenisnya? Ingat operasi JS pada objek. Jika Anda mengakses objek yang tidak ada, itu akan meminta tidak terdefinisi (karena saat ini merupakan atribut objek jendela).
Catatan: perlu untuk membedakan di sini bahwa variabel yang dibaca dan ditulis hanya digunakan untuk variabel, dan semua sifat objek dibaca. Fitur ini tidak ada. Jika tidak ada, itu akan mendorong tidak terdefinisi.
sebagai kesimpulan
Pada titik ini, hasil pemikiran saya: Ada kesamaan tertentu dalam operasi penulisan variabel dan objek. Namun, masing -masing memiliki aturan sendiri untuk membaca operasi. Karena itu, masalah di atas ditemui.
Dengan cara ini, pertanyaan berikut harus dengan mudah dijawab.
if (! ('a' di jendela)) {var a = 1;} peringatan (a);fungsi
Untuk memperluasnya, berfungsi. Ingat pra-peluang yang disebutkan di atas. Dalam pra-peluang JavaScript, selain pra-definisi variabel VAR, itu juga termasuk mengekstraksi definisi fungsi, sehingga fungsi dapat didefinisikan di mana saja dalam skrip dan dipanggil di mana saja. Tidak terbatas sebelum itu.
Namun, metode definisi fungsi mencakup metode definisi literal, menggunakan metode var untuk mendeklarasikan fungsi. Lihat di bawah
Peringatan (TypeOf Y3); // hasil? Var y3 = function () {console.log ('1'); }Ingat perjanjian ini: Panggilan harus muncul setelah deklarasi. Mengapa? Jika Anda memahami hal di atas, jawabannya di sini sebenarnya jelas. Saat Pra-Parsing VAR, mesin JavaScript akan memberi mereka nilai awal yang tidak ditentukan. Dengan cara ini, jika kita menyebutnya sebelum deklarasi, mesin JavaScript belum memperoleh nilai sebenarnya, secara alami akan melaporkan kesalahan "xxx bukan fungsi". Ini juga mengklarifikasi mengapa kedua deklarasi fungsi terkait dengan urutan deklarasi dan panggilan, dan yang lain tidak memiliki kendala seperti itu.
sebagai kesimpulan
Ini adalah fungsi, hasil dari eksekusi JS dan modifikasi dinamis, dan masih mengikuti aturan variabel pra-analisis (ketika mengingatkan di atas, itu tidak mendapatkan informasi dari fungsi literal).
Bagaimana jika itu adalah campuran dari dua. Lihatlah yang berikut, ada variabel dan fungsi untuk Y4.
waspada (typeof y4); // hasil? Fungsi y4 () {console.log ('y4')} var y4;Karena JavaScript memiliki prioritas tinggi dalam pra-parsing, Y4 secara alami merupakan tipe fungsi, tetapi setelah Y4 ditugaskan (mesin JS sedang dalam proses eksekusi), operasi penugasannya ke JS akan mengesampingkan deklarasi fungsi. Jadi:
peringatan (typeof y5); var y5 = 'sudut'; fungsi y5 () {console.log ('ghost'); } peringatan (y5);Hasil peringatan pertama adalah fungsi karena berada di bagian atas proses eksekusi JS. Kedua kalinya ketika peringatan diganti namanya, nilainya telah ditulis ulang menjadi 5 (jangan bingung dengan posisi definisi fungsi di bawah ini.)
Berpikir tentang analisis dan eksekusi JS, saya menyadari bahwa saya tiba -tiba menyadari bahwa jawaban atas banyak pertanyaan muncul secara alami. Seperti yang dikatakan penulis artikel itu, "Setelah Anda memahami konsep lingkungan eksekusi, objek panggilan, penutupan, ruang lingkup leksikal, dan rantai ruang lingkup, banyak fenomena dalam bahasa JS dapat diselesaikan dengan mudah."
Melihat ke belakang sekarang, bahkan dalam bahasa yang luar biasa ini, ada banyak alasan yang dapat ditelusuri kembali ke sana.
Bagaimana membuat penilaian parameter yang lebih baik
Setelah mendiskusikan jauh di atas, bagaimana mungkin lebih dekat dengan perkembangan yang sebenarnya? Karena JavaScript membaca dan menulis ketidakrataan, bagaimana kita bisa menghindari membuat penilaian parameter tanpa melaporkan kesalahan?
misalnya:
if (cusvar) {// penilaian di sini adalah masalah implisit. }Bagaimana menjadi lebih ketat.
if (window ['cusvar']) {// Pastikan itu tidak melaporkan kesalahan. // atau penilaian seperti itu juga layak window.cusvar | typeof cusvar! == 'tidak terdefinisi' // bekerja}Akhirnya, kuis kecil lainnya ditambahkan, (pahami pemisahan pra-parsing dan eksekusi)
var y7 = 'test'; function fun1 () {alert (y7); var y7 = 'sex';} fun1 ();Untuk informasi lebih lanjut tentang konten terkait JavaScript, silakan periksa topik -topik situs ini: "Ringkasan Efek dan Teknik Peralihan Javascript", "Ringkasan Keterampilan Algoritma Pencarian JavaScript", "Ringkasan Teknik Animasi dan Teknik JavaScript," Ringkasan Ringkasan Data Javascript dan Ringkasan Data Javascript "," Ringkasan Data JavaScript "," Ringkasan Data JavaScript "," Ringkasan DEBUGRITM PENGABUNG DAN RINGKASI DAGGING "RINGKASI DAN RINGKASAN DATRICKS" RINGKASI DAN RINGKASI DAGGING "RINGKASI DAN RINGKASI DAGGING" RINGKAS Algoritma dan teknik traversal javascript ", dan" Ringkasan Penggunaan Operasi Matematika JavaScript "
Saya harap artikel ini akan membantu pemrograman JavaScript semua orang.