ก่อนอื่นเรามาพูดถึงการแบ่งส่วนคำกันก่อน การแบ่งส่วนคำคือการแยกสตริงของอักขระออกเป็นบล็อคโค้ดที่มีความหมายต่อภาษาการเขียนโปรแกรม บล็อกโค้ดเหล่านี้เรียกว่าโทเค็น ตัวอย่างเช่น รหัส var a = 2
จะถูกแยกย่อยเป็นหน่วยคำศัพท์ต่อไปนี้ โดยเฉพาะ: var,a,=,2
หมายเหตุ: จริงๆ แล้วการแบ่งส่วนคำคือการแบ่งโค้ดทั้งหมดด้านบนออกเป็นส่วนๆ
การแยกวิเคราะห์คือการแปลงกระแสของหน่วยคำศัพท์ให้เป็นแผนผังที่ประกอบด้วยองค์ประกอบที่ซ้อนกันระดับตามระดับ ซึ่งแสดงถึงโครงสร้างทางไวยากรณ์ของโปรแกรม ต้นไม้นี้เรียกว่า: ต้นไม้ไวยากรณ์นามธรรม เนื่องจากคำมาตรฐานที่ยาวเกินไปในที่นี้ เราจะไม่พิจารณาคำเหล่านั้น ฉันจะแสดงโดยตรงในรูปแบบที่ใช้งานง่ายยิ่งขึ้น รายละเอียดมีดังนี้:
การวิเคราะห์: แผนผังไวยากรณ์นามธรรมจะมีโหนดระดับบนสุดเป็น var ตามด้วยโหนดย่อยที่มีตัวแปร a และโหนดที่มีตัวดำเนินการกำหนด = มีโหนดลูกอีกโหนด 2 อยู่ใต้สัญลักษณ์การมอบหมาย โดยเฉพาะมันสอดคล้องกับโค้ด var a = 2
กระบวนการในการแปลงแผนผังไวยากรณ์เชิงนามธรรมให้เป็นโค้ดที่ปฏิบัติการได้เรียกว่าการสร้างโค้ด กระบวนการนี้เกี่ยวข้องอย่างใกล้ชิดกับภาษาและแพลตฟอร์มเป้าหมาย พูดง่ายๆ ก็คือมีวิธีแปลงแผนผังไวยากรณ์เชิงนามธรรมของ var a = 2
ไปเป็นคำสั่งของเครื่อง ใช้เพื่อสร้างตัวแปรที่เรียกว่า a และเก็บค่าไว้ใน a
อาศัยกลไกหลักในการรันโค้ด JavaScript เมื่อเอ็นจินดำเนินการ var a = 2 มันจะพิจารณาว่าตัวแปร a ได้รับการประกาศโดยการค้นหาหรือไม่ กระบวนการค้นหาได้รับความช่วยเหลือจากขอบเขต ในระหว่างกระบวนการสืบค้น กลไกจะดำเนินการ LHS (แบบสอบถามด้านซ้าย) สำหรับตัวแปร a และแบบสอบถามที่ถูกต้องสำหรับค่า พูดง่ายๆ ก็คือ เมื่อตัวแปรปรากฏทางด้านซ้ายของการดำเนินการกำหนด แบบสอบถาม LHS จะดำเนินการ และเมื่อปรากฏทางด้านขวา แบบสอบถาม RHS จะดำเนินการ เพื่อให้แม่นยำยิ่งขึ้น แบบสอบถาม LHS จะพยายามค้นหาคอนเทนเนอร์ของตัวแปรเอง ในขณะที่แบบสอบถาม RHS จะพยายามรับค่าแหล่งที่มา
หมายเหตุ: ในฟังก์ชันจะมีทั้งแบบสอบถาม LHS และ RHS เพราะในกระบวนการส่งพารามิเตอร์ โค้ดจะดำเนินการกำหนดโดยปริยาย
เมื่อตัวแปรไม่ได้รับการประกาศ ลักษณะการทำงานของแบบสอบถาม LHS และแบบสอบถาม RHS จะแตกต่างกัน
ฟังก์ชั่นฟู(ก){ console.log(a+b); b=a;}foo(2)
หมายเหตุ: คำค้นหาแรกที่ถูกต้องบน b ไม่พบตัวแปร ซึ่งหมายความว่าเป็นตัวแปรที่ไม่ได้ประกาศ เนื่องจากไม่พบในขอบเขตที่เกี่ยวข้อง หาก RHS ไม่พบตัวแปรที่ต้องการในขอบเขตที่ซ้อนกัน โปรแกรมจะส่งข้อยกเว้น
ฟังก์ชันทดสอบ foo(a){ วาร์ ข=ก; กลับ+b; -
ปัญหา
var c=foo(2): ค้นหาคำสั่ง LHS และ RHS ทั้งหมด
คำตอบ: LHS(c=…,a=2,b=…) และ RHS(foo(2…,=a,a…,…b))