Rumah  >  Artikel  >  hujung hadapan web  >  Pra-penghuraian JavaScript dan kemahiran berkaitan analisis_kemahiran javascript

Pra-penghuraian JavaScript dan kemahiran berkaitan analisis_kemahiran javascript

WBOY
WBOYasal
2016-05-16 15:04:361061semak imbas

Artikel ini menerangkan pra-penghuraian JavaScript dan teknik yang berkaitan dengan contoh. Kongsikan dengan semua orang untuk rujukan anda, butirannya adalah seperti berikut:

Pembolehubah

Begitu juga, mulakan dengan petua perbandingan ralat dua contoh kecil ini.

alert(y1);     //代码段1
var y1 = 'dddd';
alert(y2);     //代码段2 // alert(typeof y2);
y2 = 'xxxxx';

Fikirkan dahulu, mengapa seseorang menggesa undefined dan yang lain melemparkan ralat pembolehubah tidak ditentukan. . Mari kita lihat dahulu proses penghuraian JavaScript.

Javascript akan melakukan acara "pre-parsing" sebelum melaksanakan proses tersebut. Enjin penghuraian akan melaksanakan penciptaan semua pembolehubah var pada tahap blok dan memberi mereka nilai awal: tidak ditentukan. Dengan cara ini, jelas mengapa undefined muncul dalam contoh pertama.

Jadi sekeping kod pertama sebenarnya bersamaan dengan

var y1;
alert(typeof y1); //很自然,它此时值为undefined
y1 = 'dddd';

Kemudian mengapa sekeping kod kedua menimbulkan ralat lagi. Ia tidak lagi berada dalam peringkat "pra-penghuraian". dan pelaksanaan, sebenarnya, bukan sahaja dua perkara ini), tetapi dalam peringkat pelaksanaan, sebab ralat dilemparkan ialah js tidak mengetahui status y2 dalam keadaan bahagian pelaksanaan (peringkat pra-penghuraian. tidak menangkap sebarang maklumat tentang y2), sudah tentu, ralat yang tidak ditentukan dilemparkan maklumat. Ini melibatkan masalah lain: js ialah bahasa yang ditaip lemah, dan pembolehubah boleh digunakan tanpa ditakrifkan, jadi mengapa ralat definisi dilemparkan di sini?

Semuanya berlaku atas sebab tertentu JavaScript sentiasa mempunyai banyak ciri tersendiri, seperti pembacaan dan penulisan pembolehubah yang tidak sekata. Pembolehubah yang tidak ditentukan hanya boleh ditulis, tidak boleh dibaca. Apakah yang boleh ditulis? Semua orang biasa dengan cara penulisan ini:

y2 = 'exam';  
//在没出现它的定义操作之前(即在它还没有自己的scope之前)该操作会将这段代码认为是定义一个全局变量,在window上注册一个属性y2,并赋值为exam

Tetapi apabila membacanya, enjin js tidak dapat mencari maklumat yang berkaitan tentangnya, jadi ia bertindak mengikut perangainya sendiri dan melemparkan ralat yang tidak ditentukan tanpa belas kasihan. Ini adalah peraturan permainan js. Tetapi, mengapa kita boleh mendapatkan jenisnya? Ingat bagaimana js beroperasi pada objek. Jika anda mengakses sifat dan jenis objek yang tidak wujud, anda akan digesa dengan undefined (kerana pada masa ini ia merupakan harta objek tetingkap).

Nota lain: Pembezaan perlu dibuat di sini. Pembacaan dan penulisan pembolehubah tidak sama. Ia hanya digunakan untuk pembolehubah , ia akan menggesa undefined.

Kesimpulan

Di sini, hasil pemikiran saya: Terdapat persamaan tertentu antara operasi penulisan pembolehubah dan objek Namun, masing-masing mempunyai set peraturan sendiri untuk operasi membaca.
Dengan cara ini, jawapan kepada soalan berikut sepatutnya mudah.

if (!('a' in window)) {
  var a = 1;
}
alert(a);

Fungsi

Dengan sambungan, fungsi Ingat pra-penghuraian yang dinyatakan di atas Dalam pra-penghuraian javascript, sebagai tambahan kepada pra-takrifan pembolehubah var, ia juga termasuk pengekstrakan takrifan fungsi. fungsi boleh ditakrifkan di mana-mana dalam skrip, dipanggil di mana-mana. Tidak terhad kepada keadaan sebelum ini.

Tetapi cara untuk mentakrifkan fungsi termasuk kaedah yang dipanggil definisi literal, yang menggunakan kaedah var untuk mengisytiharkan fungsi Lihat di bawah

alert(typeof y3); //结果?
var y3 = function (){ console.log('1'); }

Ingat konvensyen ini: panggilan mesti muncul selepas pernyataan Mengapa? Enjin javascript akan memberi mereka nilai awal undefined apabila menghurai var Dengan cara ini, jika kita memanggilnya sebelum pengisytiharannya, enjin javascript belum lagi mendapat nilai sebenar dan secara semula jadi akan melaporkan "xxx bukan fungsi. " Salah. Ini juga menjelaskan mengapa kedua-duanya adalah pengisytiharan fungsi, tetapi satu berkaitan dengan susunan pengisytiharan dan panggilan, manakala yang lain tidak mempunyai kekangan sedemikian.

Kesimpulan

Ia adalah fungsi, hasil daripada pelaksanaan js dan pengubahsuaian dinamik, dan masih mengikut peraturan pra-penghuraian pembolehubah (apabila memberi amaran di atas, ia tidak mendapat maklumat fungsi literal).
Bagaimana jika kedua-duanya bercampur. Lihat di bawah, terdapat kedua-dua pembolehubah dan fungsi untuk y4.

alert(typeof y4); //结果?
function y4(){
  console.log('y4')
}
var y4;

Oleh kerana keutamaan pengisytiharan fungsi dalam pra-penghuraian JavaScript adalah tinggi, y4 secara semula jadi daripada jenis fungsi, tetapi selepas y4 diberikan nilai (enjin js sedang dalam proses pelaksanaan pada masa ini), operasi penugasannya kepada js akan Override pengisytiharan fungsi. Jadi:

alert(typeof y5);
var y5 = 'angle';
function y5(){
  console.log('ghost');  
}
alert(y5);

Hasil makluman pertama adalah fungsi kerana ia berada di bahagian atas proses pelaksanaan js. Kali kedua ia memaklumkan, nilainya telah ditulis semula kepada 5 (jangan tertipu dengan kedudukan definisi fungsi di bawah.)

Memikirkan tentang penghuraian dan pelaksanaan js secara berasingan, saya mendapati bahawa mata saya tiba-tiba menjadi terang, dan jawapan kepada banyak soalan secara semula jadi seperti yang dikatakan oleh pengarang artikel itu, "Setelah anda memahami persekitaran pelaksanaan, memanggil objek,. penutupan Konsep seperti pakej, skop leksikal dan rantai skop boleh menyelesaikan banyak fenomena dalam bahasa JS dengan mudah

Melihat sekarang, walaupun dalam bahasa ini di mana terdapat banyak perkara yang luar biasa, terdapat banyak sebab yang boleh dikesan kembali kepadanya.

Cara membuat pertimbangan parameter yang lebih baik

Setelah membincangkan banyak perkara di atas, bagaimanakah kita boleh menjadikannya lebih dekat dengan pembangunan sebenar Memandangkan JavaScript mempunyai bacaan dan penulisan yang tidak sekata, bagaimanakah kita boleh mengelak daripada membuat pertimbangan parameter tanpa melaporkan ralat?

cth:

if(cusVar){ //这里的判断,是不是存在隐含的问题呢。 }

如何严谨一些呢。

if(window['cusVar']) { //保证它不报错。
  //或者这样的判断也是可行的 window.cusVar | typeof cusVar !== 'undefined'
  //干活咯
}

最后补充又一个小quiz, (理解 预解析与执行的分离)

var y7 = 'test';
function fun1(){
  alert(y7);
  var y7 = 'sex';
}
fun1();

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结

希望本文所述对大家JavaScript程序设计有所帮助。

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