ECMAScript | Типы исходного кода

ECMAScript | Типы исходного кода

Есть четыре типа кода ECMAScript:

  1. Global code
  2. Eval code
  3. Function code
  4. Module code

 

Global code

Глобальный код (Global code) — это исходный текст, который рассматривается как сценарий ECMAScript. Глобальный код конкретного скрипта не включает в себя исходный текст, который анализируется как часть FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, AsyncFunctionDeclaration, AsyncFunctionExpression, AsyncGeneratorDeclaration, AsyncGeneratorExpression, MethodDefinition, ArrowFrunction, AsyncArrowFunction, ClassDeclaration или ClassExpression.

Eval code

Оценочный код (Eval code) — это исходный текст, передаваемый встроенной функции eval. Точнее, если параметром встроенной функции eval является строка, она рассматривается как скрипт Script языка ECMAScript. Оценочный код для конкретного вызова eval — это часть глобального кода этого скрипта Script.

Function code

Код функции (Function code) — это исходный текст, который анализируется для предоставления значения внутренних слотов [[ECMAScriptCode]] и [[FormalParameters]] (раздел 10.2) объекта функции ECMAScript. Код функции конкретной функции ECMAScript не включает какой-либо исходный текст, который анализируется как код функции вложенного FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, AsyncFunctionDeclaration, AsyncFunctionExpression, AsyncGeneratorDeclaration, AsyncGeneratorExpression, MethodDefinition, ArrowFrunction, AsyncArrowFunction, ClassDeclaration или ClassExpression.

Кроме того, если исходный текст, упомянутый выше, анализируется как:

тогда исходный текст, соответствующий BindingIdentifier (если есть) этого объявления или выражения, также включается в код функции соответствующей функции.

Module code

Код модуля (Module code) — это исходный текст, то есть код, предоставленный как ModuleBody. Это код, который непосредственно оценивается при инициализации модуля. Код модуля конкретного модуля не включает исходный текст, который анализируется как часть вложенного FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, AsyncFunctionDeclaration, AsyncFunctionExpression, AsyncGeneratorDeclaration, AsyncGeneratorExpression, MethodDefinition, ArrowFunction, AsyncArrowFunction, ClassDeclaration или ClassExpression.

 

Примечание 1

Код функции обычно предоставляется в виде тел Определений Функций (15.2), Определений Стрелочных Функций (15.3), Определений Методов (15.4), Определений Функций Генератора (15.5), Определений Асинхронных Функций (15.8), Определений Функций Асинхронных Генераторов (15.6), и Асинхронные Стрелочные Функции (15.9).

Код функции также является производным от аргументов конструктора функции (20.2.1.1), конструктора GeneratorFunction (27.3.1.1) и конструктора AsyncFunction (27.7.1.1).

 

Примечание 2

Практический эффект от включения идентификатора привязки BindingIdentifier в код функции заключается в том, что ранние ошибки для кода строгого режима применяются к BindingIdentifier, который является именем функции, тело которой содержит директиву «use strict», даже если окружающий код не является кодом строгого режима.

 

11.2.1 Прологи директив и директива Use Strict

Пролог директивы (Directive Prologue) — это самая длинная последовательность выражений ExpressionStatements, встречающихся в качестве начальных StatementListItems или ModuleItems для FunctionBody, ScriptBody или ModuleBody, и где каждый ExpressionStatement в последовательности полностью состоит из токена StringLiteral, за которым следует точка с запятой. Точка с запятой может отображаться явно или может быть вставлена с помощью автоматической вставки точки с запятой (12.9). Пролог директивы может быть пустой последовательностью.

Директива Use Strict — это выражение ExpressionStatement в Прологе Директивы, StringLiteral которого является одной из точных последовательностей кодовых точек "use strict" или 'use strict'. Директива Use Strict не может содержать EscapeSequence или LineContinuation.

Примечание

ExpressionStatements пролога директивы обычно оцениваются во время оценки содержащей продукции. Реализации могут определять конкретные значения реализации для ExpressionStatements, которые не являются директивой Use Strict и которые встречаются в Прологе Директивы. Если соответствующий механизм уведомления существует, реализация должна выдать предупреждение, если она встречает в Прологе Директивы выражение ExpressionStatement, которое не является директивой строгого использования и не имеет значения, определенного реализацией.

 

11.2.2 Код Строгого Режима

Синтаксическая единица ECMAScript может обрабатываться с использованием как неограниченного, так и строгого синтаксиса и семантики режима (4.3.2). Код интерпретируется как код строгого режима в следующих ситуациях:

  1. Глобальный код является кодом строгого режима, если он начинается с пролога директивы, который содержит директиву строгого использования.
  2. Код модуля — это всегда код строгого режима.
  3. Все части ClassDeclaration или ClassExpression являются кодом строгого режима.
  4. Код оценки — это код строгого режима, если он начинается с пролога директивы, который содержит директиву Use Strict, или если вызов eval является прямым eval, который содержится в коде строгого режима.
  5. Код функции является кодом в строгом режиме, если связанный FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, AsyncFunctionDeclaration, AsyncFunctionExpression, AsyncGeneratorDeclaration, AsyncGeneratorExpressionMethodDefinition, ArrowFunction или AsyncArrowFunction содержится в коде строгого режима или значение этой функции, если значение этого кода функции [[ECMAScriptCode]] внутренний слот начинается с Пролога Директивы, который содержит директиву строгого использования.
  6. Код функции, который предоставляется в качестве аргументов встроенным конструкторам Function, Generator, AsyncFunction и AsyncGenerator, является кодом в строгом режиме, если последний аргумент является String, который при обработке является FunctionBody, который начинается с Пролога Директивы, содержащего Use Strict Директиву.

Код ECMAScript, который не является кодом строгого режима, называется нестрогим кодом (non-strict code).

 

11.2.3 Функции, не относящиеся к ECMAScript

Реализация ECMAScript может поддерживать оценку функций экзотических объектов, оценочное поведение которых выражается в некоторой определяемой хостом форме исполняемого кода, отличной от кода ECMAScript. Является ли объект функции функцией кода ECMAScript или функцией не-ECMAScript, семантически не наблюдается с точки зрения функции кода ECMAScript, которая вызывает или вызывается такой функцией, отличной от ECMAScript.

 

Информационные ссылки

Стандарт ECMAScript — Раздел «11.2 Types of Source Code» — https://tc39.es/ecma262/multipage/ecmascript-language-source-code.html#sec-types-of-source-code