Kawat gigi memiliki empat fungsi semantik di JS
Semantik 1, menyusun kalimat majemuk, ini yang paling umum
Copy kode kodenya sebagai berikut:
jika(kondisi) {
//...
}kalau tidak {
//...
}
untuk() {
//...
}
Semantik 2, deklarasi literal objek
Copy kode kodenya sebagai berikut:
var objek = {
nama: 'jack',
usia: 23
};
Semuanya adalah pernyataan penugasan, di mana {name:'jack',age:23} adalah sebuah ekspresi.
Semantik 3, mendeklarasikan fungsi atau fungsi literal
Copy kode kodenya sebagai berikut:
fungsi f1(){
//...
}
var f2 = fungsi(){
//...
}
Perbedaan antara f1 dan non-f2 adalah f1 berada pada periode interpretasi sintaksis dan non-f2 berada pada periode runtime. Perbedaannya adalah: jika kode yang memanggil fungsi berada setelah definisi fungsi, tidak ada perbedaan; jika kode yang memanggil fungsi berada sebelum definisi fungsi, f1 masih dapat dipanggil, tetapi f2 akan melaporkan kesalahan, yang menyebabkan hal tersebut f2 tidak ditentukan.
Semantik 4, notasi sintaksis untuk penanganan pengecualian terstruktur
Copy kode kodenya sebagai berikut:
mencoba {
//...
}menangkap(misal){
//...
}Akhirnya{
//...
}
Ada perbedaan antara kurung kurawal di sini dan pernyataan yang cocok (semantik 1). Jika hanya ada satu pernyataan di dalam kurung kurawal, kurung kurawal dapat dihilangkan di if/else/for, dll., tetapi try/catch/finally tidak dapat dihilangkan. dihilangkan.
Saya telah berjuang dengan kode berikut untuk waktu yang lama
Copy kode kodenya sebagai berikut:
function(){}() //Fungsi anonim segera dieksekusi, laporan berkala analisis sintaksis
{}.constructor //Dapatkan konstruktor objek literal, dan kesalahan akan dilaporkan selama analisis sintaksis
Yang membingungkan adalah mengapa [].konstruktor ditulis seperti ini tetapi tidak melaporkan kesalahan. Yang satu adalah konstruktor yang ingin mendapatkan nilai langsung dari objeknya, dan yang lainnya hanyalah konstruktor yang ingin mendapatkan nilai langsung dari objeknya. susunannya.
Tentu saja menambahkan variabel untuk menerima tidak akan menyebabkan kesalahan.
var c = {}.konstruktor;
Situasinya sama
var fn = function(){}() tidak akan melaporkan kesalahan.
Faktanya, "prioritas pernyataan" js-lah yang menyebabkan masalah, yaitu, {} dipahami sebagai blok pernyataan gabungan (semantik 1) daripada semantik objek literal (semantik 2) atau fungsi yang dideklarasikan ( semantik 3).
function(){}(), tanda kurung kurawal dipahami sebagai pernyataan gabungan. Tentu saja, sintaksis fungsi deklarasi function() sebelumnya tidak lengkap, sehingga menyebabkan kesalahan selama analisis sintaksis.
{}.konstruktor, kurung kurawal dipahami sebagai pernyataan gabungan, dan kurung kurawal diikuti oleh operator titik. Jika tidak ada objek yang masuk akal sebelum operator titik, kesalahan akan dilaporkan secara alami.
Cara mengatasinya sudah diketahui: tambahkan operator paksaan ()
(function(){})(), (function(){});//Memaksanya untuk dipahami sebagai suatu fungsi (semantik 3), "function()" berarti menjalankan fungsi tersebut, yaitu dijalankan dengan segera setelah deklarasi.
({}).constructor //({}) memaksa kurung kurawal untuk dipahami sebagai literal objek (semantik 2). "Object.xx" berarti mendapatkan anggota objek. Tentu saja, operator titik berikutnya dapat dieksekusi secara normal .