Mari kita bahas terlebih dahulu apa itu segmentasi kata. Segmentasi kata adalah menguraikan serangkaian karakter menjadi blok kode yang bermakna bagi bahasa pemrograman. Blok kode ini disebut token. Misalnya, kode var a = 2
akan didekomposisi menjadi unit leksikal berikut. Khususnya: var,a,=,2.
Catatan: Segmentasi kata sebenarnya adalah membagi seluruh kode di atas menjadi beberapa segmen.
Parsing adalah mengubah aliran unit leksikal menjadi pohon yang terdiri dari elemen-elemen yang disarangkan tingkat demi tingkat, yang mewakili struktur tata bahasa program. Pohon ini disebut: pohon sintaksis abstrak. Mengingat kata-kata standar yang terlalu panjang di sini, kami tidak akan membahasnya secara langsung. Dengan rincian sebagai berikut:
Analisis: Pohon sintaksis abstrak akan memiliki simpul tingkat atas var, diikuti oleh simpul anak dengan variabel a dan simpul dengan operator penugasan =. Ada node anak 2 lainnya di bawah simbol penugasan. Secara khusus, ini sesuai dengan kode var a = 2
.
Proses mengubah pohon sintaksis abstrak menjadi kode yang dapat dieksekusi disebut pembuatan kode. Proses ini berkaitan erat dengan bahasa dan platform target. Sederhananya, ada cara untuk mengubah pohon sintaksis abstrak var a = 2
menjadi instruksi mesin. Digunakan untuk membuat variabel bernama a dan menyimpan nilai dalam a.
terutama mengandalkan mesin untuk mengeksekusi kode JavaScript. Ketika mesin mengeksekusi var a = 2, ia akan menentukan apakah variabel a telah dideklarasikan dengan mencarinya. Proses pencarian dibantu oleh scope. Selama proses query, mesin akan melakukan LHS (query kiri) untuk variabel a dan query kanan untuk nilainya. Sederhananya, ketika variabel muncul di sisi kiri operasi penugasan, kueri LHS dilakukan, dan ketika variabel muncul di sisi kanan, kueri RHS dilakukan. Lebih tepatnya, kueri LHS mencoba menemukan wadah variabel itu sendiri, sedangkan kueri RHS mencoba mendapatkan nilai sumbernya.
Catatan: Dalam fungsinya, akan ada kueri LHS dan RHS. Karena dalam proses meneruskan parameter, kode akan melakukan penugasan implisit.
Ketika variabel belum dideklarasikan, perilaku query LHS dan query RHS berbeda.
fungsi foo(a){ konsol.log(a+b); b=a;}foo(2)
Catatan: Kueri kanan pertama pada b tidak dapat menemukan variabelnya, yang berarti variabel tersebut adalah variabel yang tidak dideklarasikan karena tidak dapat ditemukan dalam cakupan apa pun yang relevan. Jika RHS tidak dapat menemukan variabel yang diperlukan dalam cakupan bersarang, mesin akan mengeluarkan pengecualian.
foo(a){ var b=a; kembalikan a+b; } var c=foo(2)
masalah: temukan semua pertanyaan kiri dan kanan
Jawaban: Kiri(c=…,a=2,b=…) dan Kanan(foo(2…,=a,a…,…b))