Theo tiêu chuẩn ECMAScript 262 phiên bản thứ 5, phần 14.1 :
. . . các sản phẩm SourceElement ban đầu của một Chương trình hoặc FunctionBody và trong đó mỗi ExpressionStatement trong chuỗi bao gồm hoàn toàn một mã thông báo StringLiteral theo sau dấu chấm phẩy
Nhấn mạnh của tôi
và tiêu chuẩn ECMAScript 262 phiên bản thứ 6 phần 14.1.1 :
Lời mở đầu Chỉ thị là. . . các StatementListItem ban đầu hoặc ModuleItem tác phẩm của một FunctionBody, một ScriptBody, hoặc một ModuleBody.
Nhấn mạnh của tôi
Có lẽ nói một cách đơn giản hơn, phần 7.4 của ECMAScript 5 ed. tiêu chuẩn (phần 11.4 của tiêu chuẩn ECMAScript phiên bản thứ 6) nêu rõ:
Nhận xét hoạt động giống như khoảng trắng và bị loại bỏ
Vì nhận xét không phải là tuyên bố và cuối cùng sẽ bị loại bỏ, use strict;
có thể xuất hiện sau chúng vì nó là tuyên bố hiệu quả đầu tiên trong nội dung.
Một bản cập nhật sau đó nhiều năm - nhiều hơn hoặc ít hơn, nhiều bối cảnh hơn.
Hầu hết các trình phân tích cú pháp đều có một bước lexing và một bước phân tích cú pháp. Đầu tiên, Lexing, phá vỡ xuống mã nguồn văn bản vào thẻ sờ thấy hơn (chẳng hạn như left angle bracket
, identifier
, comma
, string literal
, vv) và các bước phân tích thực sự không một cái gì đó với họ - trong nhiều trường hợp (và chắc chắn trong trường hợp Javascript), biến nó thành cái được gọi là Cây cú pháp trừu tượng (hay viết tắt là AST).
Hai điều làm cho điều này "được phép", đặc biệt là theo nhận xét này - một là thực tế là các nhận xét sẽ bị loại bỏ, thường xảy ra trong quá trình ghép từ và 'use strict';
phải là câu lệnh đầu tiên, thường được kiểm tra trong quá trình phân tích cú pháp .
Vì lexing xuất hiện trước khi phân tích cú pháp, do đó việc kiểm tra 'use strict';
sẽ không bao giờ thực sự thấy các nhận xét thậm chí có khả năng xảy ra sự cố với chúng.