Ответ 1
В соответствии со стандартом ECMAScript 262, 5-е издание, раздел 14.1:
, , исходные исходные элементы SourceElement для Program или FunctionBody и где каждое ExpressionStatement в последовательности полностью состоит из токена StringLiteral, за которым следует точка с запятой
Акцент мой
и раздел 14.1.1 стандарта 6-е издание ECMAScript 262:
Директива Пролог есть. , , начальные производства StatementListItem или ModuleItem для FunctionBody, ScriptBody или ModuleBody.
Акцент мой
Возможно, проще говоря, раздел 7.4 ECMAScript 5-е изд. Стандарт (раздел 11.4 стандарта ECMAScript 6-е изд.) гласит:
Комментарии ведут себя как пробелы и отбрасываются
Поскольку комментарии не являются утверждениями и в конечном итоге отбрасываются, use strict;
может последовать за ними, так как это первое эффективное утверждение в теле.
Обновление лет спустя - более или менее, больше контекста.
У большинства парсеров есть шаг лексирования и шаг синтаксического анализа. Первый, лексический, разбивает текстовый исходный код на более ощутимые токены (такие как left angle bracket
, identifier
, comma
, string literal
и т.д.), И шаг синтаксического анализа фактически что-то с ними делает - во многих случаях (и, конечно, в случае Javascript), превратив его в то, что называется абстрактным синтаксическим деревом (или AST для краткости).
Две вещи делают это "разрешенным", особенно в соответствии с этим комментарием - во- первых, это тот факт, что комментарии должны быть отброшены, что обычно происходит во время лексизма, и 'use strict';
должен быть первым оператором, который обычно проверяется при разборе.
Поскольку перед синтаксическим разбором стоит lexing, следует проверить 'use strict';
на самом деле никогда не увидит комментарии, чтобы даже получить возможность иметь проблемы с ними.