Синтаксис Определения Функций
FunctionDeclaration [Yield, Await, Default] :
function BindingIdentifier [?Yield, ?Await] ( FormalParameters [~Yield, ~Await] ) { FunctionBody [~Yield, ~Await] }
[+Default] function ( FormalParameters [~Yield, ~Await] ) { FunctionBody [~Yield, ~Await] }
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
function BindingIdentifier ( FormalParameters ) { FunctionBody }
function ( FormalParameters ) { FunctionBody }
function BindingIdentifier opt ( FormalParameters ) { FunctionBody }
- Если исходный код, соответствующий FormalParameters, является кодом строгого режима, применяются правила ранней ошибки (Early Error) для UniqueFormalParameters : FormalParameters.
- Если BindingIdentifier присутствует, и исходный код, соответствующий BindingIdentifier, является кодом строгого режима, это является синтаксической ошибкой, если строковое значение StringValue для BindingIdentifier имеет значение «eval» или «arguments».
- Это синтаксическая ошибка, если для FunctionBodyContainsUseStrict для FunctionBody установлено значение true, а для IsSimpleParameterList для FormalParameters — значение false.
- Это синтаксическая ошибка, если какой-либо элемент BoundNames из FormalParameters также встречается в LexicallyDeclaredNames из FunctionBody.
- Это синтаксическая ошибка, если FormalParameters Содержит SuperProperty является true (истинно).
- Это синтаксическая ошибка, если FunctionBody Содержит SuperProperty является true (истинно).
- Это синтаксическая ошибка, если FormalParameters Содержит SuperCall является true (истинно).
- Это синтаксическая ошибка, если FunctionBody Содержит SuperCall является true (истинно).
LexicallyDeclaredNames объекта FunctionBody не включает идентификаторы, связанные с использованием объявлений var или функций.
FunctionBody : FunctionStatementList
- Это синтаксическая ошибка, если LexicallyDeclaredNames из FunctionStatementList содержит какие-либо повторяющиеся записи.
- Синтаксическая ошибка, если какой-либо элемент LexicallyDeclaredNames из FunctionStatementList также встречается в VarDeclaredNames из FunctionStatementList.
- Синтаксическая ошибка, если ContainsDuplicateLabels из FunctionStatementList с аргументом «» является true (истинно).
- Это синтаксическая ошибка, если ContainsUndefinedBreakTarget из FunctionStatementList с аргументом «» является true (истинно).
- Это синтаксическая ошибка, если ContainsUndefinedContinueTarget из FunctionStatementList с аргументами «» и «» является true (истинно).
Статическая семантика: Тело функции содержит строгое использование? — 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).
Альтернативная семантика представлена в B.3.3.
FunctionDeclaration : function ( FormalParameters ) { FunctionBody }
1. Вернуть NormalCompletion(empty).
FunctionExpression : function BindingIdentifier opt ( FormalParameters ) { FunctionBody }
1. Вернуть InstantiateOrdinaryFunctionExpression из FunctionExpression.
Свойство «prototype» автоматически создается для каждой функции, определенной с помощью FunctionDeclaration или FunctionExpression, чтобы учесть возможность использования функции в качестве конструктора.
FunctionStatementList : [empty]
1. Вернуть NormalCompletion(undefined).
Информационные ссылки
Стандарт ECMAScript — Раздел «15.2 Function Definitions» — https://tc39.es/ecma262/#sec-function-definitions