การแทรกเซมิโคลอนอัตโนมัติ (Automatic Semicolon Insertion - ASI) ของ JavaScript เป็นกลไกที่ช่วยแทรกเซมิโคลอนที่ขาดหายไป โดยคำสั่งต่อไปนี้ได้รับผลกระทบจาก ASI:
คำสั่งว่าง (empty statement) คำสั่งตัวแปร (var statement) คำสั่งนิพจน์ (expression statement) คำสั่ง do-while คำสั่ง continue คำสั่ง break คำสั่ง return คำสั่ง throw
กฎระเบียบอยู่ในข้อกำหนดดังนี้:
- เมื่อ Script หรือ Module ถูกแยกวิเคราะห์ (parse) จากซ้ายไปขวา: หากพบโทเค็นที่ไม่ได้รับอนุญาตโดยกฎไวยากรณ์ใดๆ เซมิโคลอนจะถูกแทรกอัตโนมัติก่อนโทเค็นที่ผิดปกตินั้น ก็ต่อเมื่อเงื่อนไขอย่างน้อยหนึ่งข้อเป็นจริง:
- โทเค็นที่ผิดปกติคือ
} - โทเค็นก่อนหน้าคือ
)และเซมิโคลอนที่แทรกเข้าไปจะถูกแปรรูปเป็นเซมิโคลอนปิดท้ายของคำสั่ง do-while (13.7.2) - พบจุดสิ้นสุดของสตรีมโทเค็น และพาร์เซอร์ไม่สามารถแยกวิเคราะห์สตรีมโทเค็นอินพุตเป็น ECMAScript หรือ Module ที่สมบูรณ์ได้ เซมิโคลอนจึงถูกแทรกอัตโนมัติ
- พบโทเค็นที่ได้รับอนุญาตโดยกฎไวยากรณ์บางกฎ แต่กฎนั้นเป็น restricted production และโทเค็นจะเป็นโทเค็นแรกสำหรับ terminal หรือ nonterminal ที่อยู่ทันทีหลัง annotation
แม้ ASI จะช่วยลดความผิดพลาดได้ แต่แนวทางปฏิบัติที่ดีที่สุดคือควรใส่เซมิโคลอนด้วยตนเองเสมอ เพื่อป้องกันพฤติกรรมที่คาดเดาไม่ได้และเพิ่มความชัดเจนของโค้ด
การแทรกเซมิโคลอนอัตโนมัติ (Automatic Semicolon Insertion - ASI) ของ JavaScript เป็นกลไกที่ช่วยแทรกเซมิโคลอนที่ขาดหายไป โดยคำสั่งต่อไปนี้ได้รับผลกระทบจาก ASI:
คำสั่งว่าง (empty statement) คำสั่งตัวแปร (var statement) คำสั่งนิพจน์ (expression statement) คำสั่ง do-while คำสั่ง continue คำสั่ง break คำสั่ง return คำสั่ง throw
กฎระเบียบอยู่ในข้อกำหนดดังนี้:
- เมื่อ Script หรือ Module ถูกแยกวิเคราะห์ (parse) จากซ้ายไปขวา: หากพบโทเค็นที่ไม่ได้รับอนุญาตโดยกฎไวยากรณ์ใดๆ เซมิโคลอนจะถูกแทรกอัตโนมัติก่อนโทเค็นที่ผิดปกตินั้น ก็ต่อเมื่อเงื่อนไขอย่างน้อยหนึ่งข้อเป็นจริง:
- โทเค็นที่ผิดปกติคือ
} - โทเค็นก่อนหน้าคือ
)และเซมิโคลอนที่แทรกเข้าไปจะถูกแปรรูปเป็นเซมิโคลอนปิดท้ายของคำสั่ง do-while (13.7.2) - พบจุดสิ้นสุดของสตรีมโทเค็น และพาร์เซอร์ไม่สามารถแยกวิเคราะห์สตรีมโทเค็นอินพุตเป็น ECMAScript หรือ Module ที่สมบูรณ์ได้ เซมิโคลอนจึงถูกแทรกอัตโนมัติ
- พบโทเค็นที่ได้รับอนุญาตโดยกฎไวยากรณ์บางกฎ แต่กฎนั้นเป็น restricted production และโทเค็นจะเป็นโทเค็นแรกสำหรับ terminal หรือ nonterminal ที่อยู่ทันทีหลัง annotation
แม้ ASI จะช่วยลดความผิดพลาดได้ แต่แนวทางปฏิบัติที่ดีที่สุดคือควรใส่เซมิโคลอนด้วยตนเองเสมอ เพื่อป้องกันพฤติกรรมที่คาดเดาไม่ได้และเพิ่มความชัดเจนของโค้ด