เป็นที่รู้จักกันดีสำหรับทุกคนว่าไวยากรณ์ของจาวาสคริปต์นั้นน่าสงสารมาก
มาวางรูปภาพก่อน
รหัสมีดังนี้:
การคัดลอกรหัสมีดังนี้:
- // 0
- // "[วัตถุวัตถุ]"
- // เท็จ
- // จริง
ข้อผิดพลาดทางไวยากรณ์ที่เจ็บปวดเช่นนี้อาจเป็นเพียงสิ่งแปลก ๆ เช่น JavaScript
ฉันเชื่อว่ารองเท้าเด็กส่วนใหญ่ที่ไม่ได้ศึกษาคอมไพเลอร์ JavaScript ไม่สามารถเข้าใจได้เลย (อย่างน้อยฉันก็พบว่ามันเหลือเชื่อ)
ต่อมาฉันไปหาสาว Baidu สักพักแล้วก็รู้ทันที!
มาดูรหัสนี้กันเถอะ:
การคัดลอกรหัสมีดังนี้:
-
A: 1
-
ฉันเชื่อว่ารองเท้าเด็กส่วนใหญ่จะคิดว่านี่เป็นการวัดโดยตรงของวัตถุตั้งแต่แรกเห็น
แล้วรหัสนี้ล่ะ?
การคัดลอกรหัสมีดังนี้:
-
var a = 1;
-
เบราว์เซอร์จะแจ้งข้อผิดพลาดทางไวยากรณ์หรือไม่?
เห็นได้ชัดว่าไม่! หากคุณคิดอย่างรอบคอบเราจะเข้าใจว่านี่เป็นบล็อกคำสั่ง
การคัดลอกรหัสมีดังนี้:
ถ้า (isnumber) {
var a = 1;
-
เมื่อพูดถึงสิ่งนี้คุณอาจค้นพบว่าจะมีความคลุมเครือใน JavaScript เริ่มต้นด้วย {
ดังนั้นคอมไพเลอร์ JavaScript เกี่ยวข้องกับความกำกวมนี้อย่างไร
เพื่อแก้ปัญหานี้วิธีการของ ECMA นั้นง่ายมากและหยาบ: เมื่อแยกวิเคราะห์ไวยากรณ์หากคำสั่งเริ่มต้นด้วย "{" มันจะตีความได้ว่าเป็นบล็อกคำสั่งเท่านั้น
นี่เป็นวิธีโกงจริงๆ!
เนื่องจากพวกเขาเป็นบล็อกคำสั่งทั้งหมดทำไม {a: 1} จึงไม่มีข้อผิดพลาดทางไวยากรณ์?
ในความเป็นจริงที่นี่ A ถูกเข้าใจโดยตัวแยกวิเคราะห์เป็นแท็ก แท็กใช้เพื่อจับคู่การหยุดพักและดำเนินการต่อสำหรับการกระโดดทิศทาง
ดังนั้นวิธีการเขียนดังกล่าวจะทำให้เกิดข้อยกเว้น:
การคัดลอกรหัสมีดังนี้:
-
A: function () {}
-
เพราะฟังก์ชัน () {} ไม่ใช่การประกาศฟังก์ชั่นและไม่ใช่การแสดงออกของฟังก์ชัน
ณ จุดนี้ทุกคนควรมีแนวคิดพื้นฐานเกี่ยวกับการรักษาแปลก ๆ ของ {} ลองดูที่ประโยคสองสามข้อที่กล่าวถึงในตอนต้นของบทความ:
การคัดลอกรหัสมีดังนี้:
- // 0
- // "[วัตถุวัตถุ]"
- // เท็จ
- // จริง
อันแรกเนื่องจาก {} เป็นบล็อกคำสั่งรหัสสามารถเข้าใจได้ว่า:
การคัดลอกรหัสมีดังนี้:
ถ้า (1) {}
-
ดังนั้นค่าส่งคืนคือ 0
ประการที่สองเนื่องจาก {} ไม่ได้อยู่ที่จุดเริ่มต้นของคำสั่งจึงเป็นปริมาณโดยตรงของวัตถุปกติอาร์เรย์ที่ว่างเปล่าและวัตถุว่างจะถูกเพิ่มโดยตรงและ "[วัตถุวัตถุ]" จะถูกส่งคืน
ฉันเข้าใจบทความที่หนึ่งและสอง แต่ไม่จำเป็นต้องอธิบายบทความที่สาม
ข้อ 4 เนื่องจากมันเริ่มต้นด้วย () {} แรกถูกแยกวิเคราะห์เป็นปริมาณโดยตรงของวัตถุดังนั้นสูตรทั้งสองจะเท่ากันและส่งคืนจริง