JavaScript sử dụng cơ chế chèn dấu chấm phẩy tự động (Automatic Semicolon Insertion - ASI) để tự động bổ sung các dấu chấm phẩy (;) bị thiếu trong mã nguồn. Điều này giúp giảm thiểu lỗi cú pháp khi lập trình viên quên đặt dấu kết thúc câu lệnh.
Các câu lệnh bị ảnh hưởng bởi ASI
Theo đặc tả ECMAScript, ASI áp dụng cho các loại câu lệnh sau:
- Câu lệnh rỗng (empty statement)
- Câu lệnh khai báo biến (var statement)
- Câu lệnh biểu thức (expression statement)
- Câu lệnh
do-while - Câu lệnh
continue - Câu lệnh
break - Câu lệnh
return - Câu lệnh
throw
Quy tắc chi tiết của ASI
Khi phân tích mã từ trái sang phải, trình phân tích cú pháp (parser) sẽ tự động chèn dấu chấm phẩy trong các trường hợp sau:
- Gặp token không hợp lệ: Khi gặp một token không được phép bởi ngữ pháp, dấu chấm phẩy sẽ được chèn trước token đó nếu thỏa mãn ít nhất một điều kiện:
- Token gây lỗi là
}. - Token trước đó là
)và dấu chấm phẩy chèn vào sẽ đóng vai trò kết thúc câu lệnhdo-while.
- Token gây lỗi là
- Kết thúc luồng token: Khi hết luồng token đầu vào mà parser không thể phân tích thành một Script hoặc Module hoàn chỉnh, dấu chấm phẩy sẽ được chèn tự động.
- Sản xuất bị hạn chế (restricted production): Khi gặp token được phép bởi ngữ pháp nhưng thuộc sản xuất bị hạn chế, và token đó là token đầu tiên của terminal/nonterminal ngay sau annotation, dấu chấm phẩy sẽ được chèn.
Ví dụ minh họa
// ASI tự động chèn dấu chấm phẩy
return
true;
// Được hiểu như:
return; true;
// Hoặc
a = b
++c
// Được hiểu như:
a = b;
++c;
Lời khuyên tốt nhất
Mặc dù ASI giúp mã linh hoạt, bạn nên luôn viết rõ ràng dấu chấm phẩy để tránh hành vi không mong muốn, đặc biệt khi:
- Bắt đầu dòng bằng
(,[,`,+,-,/ - Sử dụng
return,throw,break,continuevới giá trị trên dòng mới
Hiểu rõ ASI giúp bạn gỡ lỗi hiệu quả hơn và viết JavaScript an toàn, dự đoán được.