ECMAScript | Определения функций (Function Definitions)

ECMAScript | Определения функций (Function Definitions)

Синтаксис Определения Функций

FunctionDeclaration [Yield, Await, Default] :

function BindingIdentifier [?Yield, ?Await] ( FormalParameters [~Yield, ~Await] ) { FunctionBody [~Yield, ~Await] }

[+Default] function ( FormalParameters [~Yield, ~Await] ) { FunctionBody [~Yield, ~Await] }

FunctionExpression :

function BindingIdentifier [~Yield, ~Await] opt ( FormalParameters [~Yield, ~Await] ) { FunctionBody [~Yield, ~Await] }

 

FunctionBody [Yield, Await] :

FunctionStatementList [?Yield, ?Await]

 

FunctionStatementList [Yield, Await] :

StatementList [?Yield, ?Await, +Return] opt

 

Статическая семантика: Ранние Ошибки — Early Errors

FunctionDeclaration :

function BindingIdentifier ( FormalParameters ) { FunctionBody }

function ( FormalParameters ) { FunctionBody }

FunctionExpression :

function BindingIdentifier opt ( FormalParameters ) { FunctionBody }

Примечание

LexicallyDeclaredNames объекта FunctionBody не включает идентификаторы, связанные с использованием объявлений var или функций.

FunctionBody : FunctionStatementList

 

Статическая семантика: Тело функции содержит строгое использование? —  FunctionBodyContainsUseStrict

FunctionBody : FunctionStatementList

1. Если пролог директивы FunctionBody содержит директиву Use Strict, верните true; в противном случае верните false.

 

Семантика среды выполнения: Оценка Тела Функции — EvaluateFunctionBody

С параметрами functionObject и argumentsList (Список).

FunctionBody : FunctionStatementList

1. Выполнить ? FunctionDeclarationInstantiation(functionObject, argumentsList).
2. Вернуть результат вычисления FunctionStatementList.

 

Семантика среды выполнения: Создание Экземпляра Обычного Функционального Объекта — InstantiateOrdinaryFunctionObject

С параметрами scope и privateScope.

FunctionDeclaration : function BindingIdentifier ( FormalParameters ) { FunctionBody }

1. Пусть имя name будет строковым значением StringValue для BindingIdentifier.
2. Пусть sourceText будет исходным текстом, совпадающим с FunctionDeclaration.
3. Пусть F будет OrdinaryFunctionCreate(%Function.prototype%, sourceText, FormalParameters, FunctionBody, non-lexical-this, scope, privateScope).
4. Выполните SetFunctionName(F, name).
5. Выполните MakeConstructor(F).
6. Верните F.

FunctionDeclaration : function ( FormalParameters ) { FunctionBody }

1. Пусть sourceText будет исходным текстом, совпадающим с FunctionDeclaration.
2. Пусть F будет OrdinaryFunctionCreate(%Function.prototype%, sourceText, FormalParameters, FunctionBody, non-lexical-this, scope, privateScope).
3. Выполните SetFunctionName(F, «по умолчанию»).
4. Выполните MakeConstructor(F).
5. Верните F.
Примечание

Анонимное объявление функции FunctionDeclaration может происходить только как часть объявления export default (экспорта по умолчанию), и поэтому его функциональный код всегда является кодом строгого режима.

 

Семантика среды выполнения: Выражение Создания Обычного Экземпляра Функции —  InstantiateOrdinaryFunctionExpression

С необязательным параметром name.

FunctionExpression : function ( FormalParameters ) { FunctionBody }

1. Если имя name не указано, установите для имени name значение "".
2. Пусть область видимости scope будет Лексической средой (LexicalEnvironment) текущего контекста выполнения.
3. Пусть privateScope будет Частной средой (PrivateEnvironment) текущего контекста выполнения.
4. Пусть sourceText будет исходным текстом, совпадающим с FunctionExpression.
5. Пусть замыкание closure будет OrdinaryFunctionCreate(%Function.prototype%, sourceText, FormalParameters, FunctionBody, non-lexical-this, scope, privateScope).
6. Выполните SetFunctionName(closure, name).
7. Выполните MakeConstructor(closure).
8. Вернуть closure.

FunctionExpression : function BindingIdentifier ( FormalParameters ) { FunctionBody }

1. Утверждено: имя name не указано.
2. Задайте имени name строковое значение StringValue для BindingIdentifier.
3. Пусть область действия scope будет LexicalEnvironment текущего контекста выполнения.
4. Пусть funcEnv будет NewDeclarativeEnvironment(scope).
5. Выполните funcEnv.CreateImmutableBinding(name, false).
6. Пусть privateScope будет PrivateEnvironment текущего контекста выполнения.
7. Пусть sourceText будет исходным текстом, совпадающим с FunctionExpression.
8. Пусть замыкание closure будет OrdinaryFunctionCreate(%Function.prototype%, sourceText, FormalParameters, FunctionBody, non-lexical-this, funcEnv, privateScope).
9. Выполните SetFunctionName(closure, name).
10. Выполните MakeConstructor(closure).
11. Выполните funcEnv.InitializeBinding(name, closure).
12. Возвратное closure.
Примечание

На BindingIdentifier в FunctionExpression можно ссылаться изнутри FunctionBody FunctionExpression, чтобы функция могла вызывать себя рекурсивно. Однако, в отличие от FunctionDeclaration, на BindingIdentifier в FunctionExpression нельзя ссылаться, и это не влияет на область, охватывающую FunctionExpression.

 

Семантика времени выполнения: Оценка — Evaluation

FunctionDeclaration : function BindingIdentifier ( FormalParameters ) { FunctionBody }

1. Вернуть NormalCompletion(empty).
Примечание 1

Альтернативная семантика представлена в B.3.3.

FunctionDeclaration : function ( FormalParameters ) { FunctionBody }

1. Вернуть NormalCompletion(empty).

FunctionExpression : function BindingIdentifier opt ( FormalParameters ) { FunctionBody }

1. Вернуть InstantiateOrdinaryFunctionExpression из FunctionExpression.
Примечание 2

Свойство «prototype» автоматически создается для каждой функции, определенной с помощью FunctionDeclaration или FunctionExpression, чтобы учесть возможность использования функции в качестве конструктора.

FunctionStatementList : [empty]

1. Вернуть NormalCompletion(undefined).

 

 

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

Стандарт ECMAScript — Раздел «15.2 Function Definitions» — https://tc39.es/ecma262/#sec-function-definitions