JavaScript | Стрелочная функция (Arrow Function)

JavaScript | Стрелочная функция (Arrow Function)

Определение стрелочной функции (Arrow Function Definitions)

Синтаксис стрелочной функции

ArrowFunction [In, Yield, Await] :

ArrowParameters [?Yield, ?Await] [нет LineTerminator здесь] => ConciseBody [?In]

ArrowParameters [Yield, Await] :

BindingIdentifier [?Yield, ?Await]

CoverParenthesizedExpressionAndArrowParameterList [?Yield, ?Await]

ConciseBody [In] :

[lookahead ≠ {] ExpressionBody [?In, ~Await]

{ FunctionBody [~Yield, ~Await] }

ExpressionBody [In, Await] :

AssignmentExpression [?In, ~Yield, ?Await]

 

Дополнительный синтаксис стрелочной функции

При обработке экземпляра продукции

ArrowParameters [Yield, Await] : CoverParenthesizedExpressionAndArrowParameterList [?Yield, ?Await]

интерпретация CoverParenthesizedExpressionAndArrowParameterList уточняется с использованием следующей грамматики:

ArrowFormalParameters [Yield, Await] :

( UniqueFormalParameters [?Yield, ?Await] )

 

Статическая семантика: ранние ошибки

ArrowFunction : ArrowParameters => ConciseBody

ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList

 

Статическая семантика: ConciseBodyContainsUseStrict

ConciseBody : ExpressionBody

1. Вернуть false.

ConciseBody : { FunctionBody }

1. Вернуть FunctionBodyContainsUseStrict из FunctionBody.

 

Статическая семантика: CoveredFormalsList

ArrowParameters : BindingIdentifier

1. Вернуть эти ArrowParameters.

CoverParenthesizedExpressionAndArrowParameterList :

( Expression )
( Expression , )
( )
( … BindingIdentifier )
( … BindingPattern )
( Expression , … BindingIdentifier )
( Expression , … BindingPattern )

1. Вернуть ArrowFormalParameters которые покрываются CoverParenthesizedExpressionAndArrowParameterList.

 

Семантика среды выполнения: EvaluateConciseBody

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

ConciseBody : ExpressionBody

1. Выполнить ? FunctionDeclarationInstantiation(functionObject, argumentsList).
2. Вернуть результат оценки ExpressionBody.

 

Семантика среды выполнения: InstantiateArrowFunctionExpression

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

ArrowFunction : ArrowParameters => ConciseBody

1. Если name отсутствует, установите для name значение "".
2. Пусть область видимости scope будет LexicalEnvironment текущего контекста выполнения.
3. Пусть sourceText будет исходным текстом, сопоставленным ArrowFunction.
4. Пусть parameters будут CoveredFormalsList из ArrowParameters.
5. Пусть замыкание closure будет OrdinaryFunctionCreate(%Function.prototype%, sourceText, parameters, ConciseBody, lexical-this, scope).
6. Выполнить SetFunctionName(closure, name).
7. Вернуть замыкание closure.
Примечание

ArrowFunction не определяет локальные привязки для arguments, super, this или new.target. Любая ссылка на arguments, super, this или new.target в ArrowFunction должна разрешаться в привязку в лексически включающей среде. Обычно это будет Функциональная Среда непосредственно включающей функции. Несмотря на то, что ArrowFunction может содержать ссылки на super, объект функции, созданный на шаге 5, не превращается в метод путем выполнения MakeMethod.

ArrowFunction, которая ссылается на super, всегда содержится в не-ArrowFunction, и необходимое состояние для реализации super доступно через область видимости scope, которая захватывается функциональным объектом ArrowFunction.

 

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

ArrowFunction : ArrowParameters => ConciseBody

1. Вернуть InstantiateArrowFunctionExpression из ArrowFunction.

ExpressionBody : AssignmentExpression

1. Пусть exprRef будет результатом вычисления AssignmentExpression.
2. Пусть exprValue будет ? GetValue(exprRef).
3. Вернуть Completion { [[Type]]: return, [[Value]]: exprValue, [[Target]]: empty }.

 

Примеры стрелочных функций

Стрелочная функция без параметров

Стрелочная функция с одним параметром

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

Алгоритмические обозначения

Условные обозначения

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