ECMAScript | Левосторонние выражения (Left-Hand-Side Expressions)

ECMAScript | Левосторонние выражения (Left-Hand-Side Expressions)

Синтаксис левосторонних выражений

MemberExpression [Yield, Await] :

PrimaryExpression [?Yield, ?Await]

MemberExpression [?Yield, ?Await] [ Expression [+In, ?Yield, ?Await] ]

MemberExpression [?Yield, ?Await] . IdentifierName

MemberExpression [?Yield, ?Await] TemplateLiteral [?Yield, ?Await, +Tagged]

SuperProperty [?Yield, ?Await]

MetaProperty

new MemberExpression [?Yield, ?Await] Arguments [?Yield, ?Await]

MemberExpression [?Yield, ?Await] . PrivateIdentifier

 

SuperProperty [Yield, Await] :

super [ Expression [+In, ?Yield, ?Await] ]

super . IdentifierName

 

MetaProperty :

NewTarget

ImportMeta

 

NewTarget :

new . target

 

ImportMeta :

import . meta

 

NewExpression [Yield, Await] :

MemberExpression [?Yield, ?Await]

new NewExpression [?Yield, ?Await]

 

CallExpression [Yield, Await] :

CoverCallExpressionAndAsyncArrowHead [?Yield, ?Await]

SuperCall [?Yield, ?Await]

ImportCall [?Yield, ?Await]

CallExpression [?Yield, ?Await] Arguments [?Yield, ?Await]

CallExpression [?Yield, ?Await] [ Expression [+In, ?Yield, ?Await] ]

CallExpression [?Yield, ?Await] . IdentifierName

CallExpression [?Yield, ?Await] TemplateLiteral [?Yield, ?Await, +Tagged]

CallExpression [?Yield, ?Await] . PrivateIdentifier

 

SuperCall [Yield, Await] :

super Arguments [?Yield, ?Await]

 

ImportCall [Yield, Await] :

import ( AssignmentExpression [+In, ?Yield, ?Await] )

 

Arguments [Yield, Await] :

( )

( ArgumentList [?Yield, ?Await] )

( ArgumentList [?Yield, ?Await] , )

 

ArgumentList [Yield, Await] :

AssignmentExpression [+In, ?Yield, ?Await]

 AssignmentExpression [+In, ?Yield, ?Await]

ArgumentList [?Yield, ?Await] , AssignmentExpression [+In, ?Yield, ?Await]

ArgumentList [?Yield, ?Await] ,  AssignmentExpression [+In, ?Yield, ?Await]

 

OptionalExpression [Yield, Await] :

MemberExpression [?Yield, ?Await] OptionalChain [?Yield, ?Await]

CallExpression [?Yield, ?Await] OptionalChain [?Yield, ?Await]

OptionalExpression [?Yield, ?Await] OptionalChain [?Yield, ?Await]

 

OptionalChain [Yield, Await] :

?. Arguments [?Yield, ?Await]

?. [ Expression [+In, ?Yield, ?Await] ]

?. IdentifierName

?. TemplateLiteral [?Yield, ?Await, +Tagged]

?. PrivateIdentifier

OptionalChain [?Yield, ?Await] Arguments [?Yield, ?Await]

OptionalChain [?Yield, ?Await] [ Expression [+In, ?Yield, ?Await] ]

OptionalChain [?Yield, ?Await] . IdentifierName

OptionalChain [?Yield, ?Await] TemplateLiteral [?Yield, ?Await, +Tagged]

OptionalChain [?Yield, ?Await] . PrivateIdentifier

 

LeftHandSideExpression [Yield, Await] :

NewExpression [?Yield, ?Await]

CallExpression [?Yield, ?Await]

OptionalExpression [?Yield, ?Await]

 

Дополнительный синтаксис

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

CallExpression : CoverCallExpressionAndAsyncArrowHead

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

CallMemberExpression [Yield, Await] :

MemberExpression [?Yield, ?Await] Arguments [?Yield, ?Await]

 

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

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

OptionalChain :

?. TemplateLiteral

OptionalChain TemplateLiteral

  • Если какой-либо код соответствует этому продукту, это синтаксическая ошибка.

 

Примечание

Это производство существует для предотвращения применения правил автоматической вставки точки с запятой (12.9) к следующему коду:

a?.b

`c`

так что это будет интерпретировано как два действительных утверждения. Цель состоит в том, чтобы поддерживать согласованность с аналогичным кодом без необязательного связывания:

a.b

`c`

что является допустимым заявлением и где автоматическая вставка точки с запятой не применяется.

 

ImportMeta :

import . meta

 

 

Свойство получателей доступа

Примечание

Доступ к свойствам осуществляется по имени, используя либо точечную нотацию:

MemberExpression . IdentifierName
CallExpression . IdentifierName

либо обозначение скобок:

MemberExpression [ Expression ]
CallExpression [ Expression ]

 

Точечная запись объясняется следующим синтаксическим преобразованием:

MemberExpression . IdentifierName

идентичен по своему поведению

MemberExpression [ <identifier-name-string> ]

и аналогично

идентичен по своему поведению

CallExpression [ <identifier-name-string> ]

где <identifier-name-string> является результатом оценки строкового значения StringValue для IdentifierName.

 

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

MemberExpression : MemberExpression [ Expression ]

1. Пусть baseReference будет результатом вычисления MemberExpression.
2. Пусть baseValue будет ? GetValue(baseReference).
3. Если код, соответствующий этому выражению MemberExpression, является кодом строгого режима, пусть strict будет истинным - true; иначе пусть strict будет ложным - false.
4. Вернуть ? EvaluatePropertyAccessWithExpressionKey(baseValue, Expression, strict).

 

MemberExpression : MemberExpression . IdentifierName

1. Пусть baseReference будет результатом вычисления MemberExpression.
2. Пусть baseValue будет ? GetValue(baseReference).
3. Если код, соответствующий этому выражению MemberExpression, является кодом строгого режима, пусть strict будет истинным - true; иначе пусть strict будет ложным - false.
4. Вернуть ? EvaluatePropertyAccessWithIdentifierKey(baseValue, IdentifierName, strict).

 

MemberExpression : MemberExpression . PrivateIdentifier

1. Пусть baseReference будет результатом вычисления MemberExpression.
2. Пусть baseValue будет ? GetValue(baseReference).
3. Пусть bv будет ? RequireObjectCoercible(baseValue).
4. Пусть fieldNameString будет StringValue для PrivateIdentifier.
5. Вернуть ! MakePrivateReference(bv, fieldNameString).

 

CallExpression : CallExpression [ Expression ]

1. Пусть baseReference будет результатом вычисления CallExpression.
2. Пусть baseValue будет ? GetValue(baseReference).
3. Если код, соответствующий этому CallExpression, является кодом строгого режима, пусть strict будет истинным - true; иначе пусть strict будет ложным - false.
4. Вернуть ? EvaluatePropertyAccessWithExpressionKey(baseValue, Expression, strict).

 

CallExpression : CallExpression . IdentifierName

1. Пусть baseReference будет результатом вычисления CallExpression.
2. Пусть baseValue будет ? GetValue(baseReference).
3. Если код, соответствующий этому CallExpression, является кодом строгого режима, пусть strict будет истинным - true; иначе пусть strict будет ложным - false.
4. Вернуть ? EvaluatePropertyAccessWithIdentifierKey(baseValue, IdentifierName, strict).

 

CallExpression : CallExpression . PrivateIdentifier

1. Пусть baseReference будет результатом вычисления CallExpression.
2. Пусть baseValue будет ? GetValue(baseReference).
3. Пусть bv будет ? RequireObjectCoercible(baseValue).
4. Пусть fieldNameString будет StringValue для PrivateIdentifier.
5. Вернуть ! MakePrivateReference(bv, fieldNameString).

 

EvaluatePropertyAccessWithExpressionKey ( baseValue, expression, strict )

Абстрактная операция EvaluatePropertyAccessWithExpressionKey (Оценить доступ к свойству с помощью ключа выражения) принимает аргументы baseValue (значение языка ECMAScript), выражение expression (узел синтаксического анализа) и strict (логическое значение). При вызове она выполняет следующие шаги:

1. Пусть propertyNameReference будет результатом вычисления выражения expression.
2. Пусть propertyNameValue будет ? GetValue(propertyNameReference).
3. Пусть bv будет ? RequireObjectCoercible(baseValue).
4. Пусть propertyKey будет ? ToPropertyKey(propertyNameValue).
5. Верните ссылочную запись Reference Record {[[Base]]: bv, [[ReferencedName]]: propertyKey, [[Strict]]: strict, [[ThisValue]]: empty} ".

 

EvaluatePropertyAccessWithIdentifierKey ( baseValue, identifierName, strict )

Абстрактная операция EvaluatePropertyAccessWithIdentifierKey (Оценить доступ к свойству с помощью ключа идентификатора) принимает аргументы baseValue (значение языка ECMAScript), identifierName (узел синтаксического анализа) и strict (логическое значение). При вызове он выполняет следующие шаги:

1. Утверждено: identifierName - это IdentifierName.
2. Пусть bv будет ? RequireObjectCoercible(baseValue).
3. Пусть propertyNameString будет StringValue для identifierName.
4. Верните ссылочную запись Reference Record {[[Base]]: bv, [[ReferencedName]]: propertyNameString, [[Strict]]: strict, [[ThisValue]]: empty} ".

 

Оператор new

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

NewExpression : new NewExpression

1. Вернуть ? EvaluateNew(NewExpression, empty).

MemberExpression : new MemberExpression Arguments

1. Вернуть ? EvaluateNew(MemberExpression, Arguments).

valuateNew ( constructExpr, arguments )

Абстрактная операция EvaluateNew принимает аргументы constructExpr и arguments. При вызове она выполняет следующие шаги:

1. Утверждено: constructExpr - это либо NewExpression, либо MemberExpression.
2. Утверждено: arguments либо пусто empty, либо Arguments.
3. Пусть ref будет результатом вычисления constructExpr.
4. Пусть constructor будет ? GetValue(ref).
5. Если arguments является empty, пусть argList будет новым пустым Списком.
6. Иначе,
   a. Пусть argList будет ? ArgumentListEvaluation из arguments.
7. Если IsConstructor(constructor) является false, выбросить исключение TypeError.
8. Вернуть ? Construct(constructor, argList).

 

Вызов функций

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

CallExpression : CoverCallExpressionAndAsyncArrowHead

1. Пусть expr будет выражением CallMemberExpression, которое покрывается CoverCallExpressionAndAsyncArrowHead.
2. Пусть memberExpr будет выражением MemberExpression выражения expr.
3. Пусть arguments будут аргументами Arguments выражения expr.
4. Пусть ref будет результатом вычисления memberExpr.
5. Пусть func будет ? GetValue(ref).
6. Если ref - это ссылочная запись Reference Record, IsPropertyReference(ref) - false, а ref.[[ReferencedName]] - «eval», тогда
   а. Если SameValue(func, %eval%) истинно - true, то
      i. Пусть argList будет ? ArgumentListEvaluation из arguments.
      ii. Если в argList нет элементов, вернуть undefined.
      iii. Пусть evalArg будет первым элементом argList.
      iv. Если исходный код, соответствующий этому CallExpression, является кодом строгого режима, пусть strictCaller будет истинным - true. В противном случае пусть strictCaller будет false.
      v. Пусть evalRealm будет текущей записью области.
      vi. Вернуть ? PerformEval(evalArg, evalRealm, strictCaller, true).
7. Пусть thisCall будет этим CallExpression.
8. Пусть tailCall будет IsInTailPosition(thisCall).
9. Вернуть ? EvaluateCall(func, ref, arguments, tailCall).

 

Вычисление CallExpression, выполняющее шаг 6.a.vi, является direct eval (прямым вычислением).

 

CallExpression : CallExpression Arguments

1. Пусть ref будет результатом вычисления CallExpression.
2. Пусть func будет ? GetValue(ref).
3. Пусть thisCall будет этим CallExpression.
4. Пусть tailCall будет IsInTailPosition(thisCall).
5. Вернуть ? EvaluateCall(func, ref, Arguments, tailCall).

 

EvaluateCall ( func, ref, arguments, tailPosition )

Абстрактная операция EvaluateCall (Оценка вызова) принимает аргументы func (значение языка ECMAScript), ref (значение языка ECMAScript или ссылочную запись Reference Record), arguments (узел синтаксического анализа) и tailPosition (логическое значение). При вызове он выполняет следующие шаги:

1. Если ref - это ссылочная запись Reference Record, тогда
   а. Если IsPropertyReference(ref) истинно, то
      i. Пусть thisValue будет GetThisValue(ref).
   b. Иначе,
      i. Пусть refEnv будет ref.[[Base]].
      ii. Утверждено: refEnv - это запись среды Environment Record.
      iii. Пусть thisValue будет refEnv.WithBaseObject ().
2. Иначе,
   а. Пусть thisValue будет undefined(не определено).
3. Пусть argList будет ? ArgumentListEvaluation из arguments.
4. Если Type(func) не Object, выбросить исключение TypeError.
5. Если IsCallable(func) ложно - false, выбросить исключение TypeError.
6. Если tailPosition истинно - true, выполните PrepareForTailCall().
7. Пусть result будет вызовом Call(func, thisValue, argList).
8. Утверждено: если tailPosition имеет значение true, вышеупомянутый вызов не вернется сюда, а вместо этого оценка продолжится, как если бы следующий возврат уже произошел.
9. Утверждено: Если результат result не является внезапным завершением, тогда Type(result) является типом языка ECMAScript.
10. Вернуть результат result.

 

Ключевое слово super

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

SuperProperty : super [ Expression ]

1. Пусть env будет GetThisEnvironment().
2. Пусть actualThis будет ? env.GetThisBinding().
3. Пусть propertyNameReference будет результатом вычисления Expression.
4. Пусть propertyNameValue будет ? GetValue(propertyNameReference).
5. Пусть propertyKey будет? ToPropertyKey(propertyNameValue).
6. Если код, соответствующий этому суперсвойству SuperProperty, является кодом строгого режима, пусть strict будет истинным - true; иначе пусть strict будет ложным - false.
7. Вернуть ? MakeSuperPropertyReference(actualThis, propertyKey, strict).

 

SuperProperty : super . IdentifierName

1. Пусть env будет GetThisEnvironment().
2. Пусть actualThis будет ? env.GetThisBinding().
3. Пусть propertyKey будет StringValue для IdentifierName.
4. Если код, соответствующий этому суперсвойству SuperProperty, является кодом строгого режима, пусть strict будет истинным - true; иначе пусть strict будет ложным - false.
5. Вернуть ? MakeSuperPropertyReference(actualThis, propertyKey, strict).

 

SuperCall : super Arguments

1. Пусть newTarget будет GetNewTarget().
2. Утверждено: Type(newTarget) - это объект Object.
3. Пусть func будет ! GetSuperConstructor().
4. Пусть argList будет ? ArgumentListEvaluation из Arguments.
5. Если IsConstructor(func) имеет значение false, выбросить исключение TypeError.
6. Пусть result будет ? Построить Construct(func, argList, newTarget).
7. Пусть thisER будет GetThisEnvironment().
8. Выполнить ? thisER.BindThisValue(result).
9. Пусть F будет thisER.[[FunctionObject]].
10. Утверждено: F - объект функции ECMAScript.
11. Выполнить ? InitializeInstanceElements(result, F).
12. Вернуть результат result.

 

GetSuperConstructor ( )

Абстрактная операция GetSuperConstructor (Получить конструктор super) не принимает аргументов. При вызове она выполняет следующие шаги:

1. Пусть envRec будет GetThisEnvironment().
2. Утверждено: envRec - это функциональная запись среды Environment Record.
3. Пусть activeFunction будет envRec.[[FunctionObject]].
4. Утверждено: activeFunction - это объект функции ECMAScript.
5. Пусть superConstructor будет ! activeFunction.[[GetPrototypeOf]]().
6. Вернуть superConstructor.

 

MakeSuperPropertyReference ( actualThis, propertyKey, strict )

Абстрактная операция MakeSuperPropertyReference (Создание ссылки на свойство super) принимает аргументы actualThis, propertyKey и strict. При вызове она выполняет следующие шаги:

1. Пусть env будет GetThisEnvironment().
2. Утверждено: env.HasSuperBinding() истинно - true.
3. Пусть baseValue будет ? env.GetSuperBase().
4. Пусть bv будет ? RequireObjectCoercible(baseValue).
5. Верните ссылочную запись Reference Record {[[Base]]: bv, [[ReferencedName]]: propertyKey, [[Strict]]: strict, [[ThisValue]]: actualThis} ".
6. ПРИМЕЧАНИЕ. Будет возвращена супер ссылочная запись.

 

Списки аргументов

Примечание

Оценка списка аргументов дает список значений.

Семантика времени выполнения: Оценка списка аргументов — ArgumentListEvaluation

Arguments : ( )

1. Верните новый пустой список.

 

ArgumentList : AssignmentExpression

1. Пусть ref будет результатом вычисления AssignmentExpression.
2. Пусть arg будет ? GetValue(ref).
3. Вернуть список, единственным элементом которого является arg.

 

ArgumentList :  AssignmentExpression

1. Пусть список list будет новым пустым списком.
2. Пусть spreadRef будет результатом вычисления AssignmentExpression.
3. Пусть spreadObj будет ? GetValue(spreadRef).
4. Пусть iteratorRecord будет ? GetIterator(spreadObj).
5. Повторите,
   а. Пусть next будет ? IteratorStep(iteratorRecord).
   b. Если next является false, вернуть список list.
   c. Пусть nextArg будет ? IteratorValue(next).
   d. Добавьте nextArg в качестве последнего элемента списка list.

 

ArgumentList : ArgumentList , AssignmentExpression

1. Пусть precedingArgs будет ? ArgumentListEvaluation для ArgumentList.
2. Пусть ref будет результатом вычисления AssignmentExpression.
3. Пусть arg будет ? GetValue(ref).
4. Добавьте аргумент arg в конец предшествующего аргумента precedingArgs.
5. Верните precedingArgs.

 

ArgumentList : ArgumentList , … AssignmentExpression

1. Пусть precedingArgs будет ? ArgumentListEvaluation для ArgumentList.
2. Пусть spreadRef будет результатом вычисления AssignmentExpression.
3. Пусть iteratorRecord будет ? GetIterator(? GetValue(spreadRef)).
4. Повторите,
   а. Пусть next будет ? IteratorStep(iteratorRecord).
   b. Если next ложно, верните precedingArgs.
   c. Пусть nextArg будет ? IteratorValue(next).
   d. Добавьте nextArg в качестве последнего элемента precedingArgs.

 

TemplateLiteral : NoSubstitutionTemplate

1. Пусть templateLiteral будет этим TemplateLiteral.
2. Пусть siteObj будет GetTemplateObject(templateLiteral).
3. Вернуть список, единственным элементом которого является siteObj.

 

TemplateLiteral : SubstitutionTemplate

1. Пусть templateLiteral будет этим TemplateLiteral.
2. Пусть siteObj будет GetTemplateObject(templateLiteral).
3. Пусть remaining будет ? ArgumentListEvaluation из SubstitutionTemplate.
4. Вернуть список, первым элементом которого является siteObj, а последующие элементы - элементами оставшихся remaining.

 

SubstitutionTemplate : TemplateHead Expression TemplateSpans

1. Пусть firstSubRef будет результатом вычисления Expression.
2. Пусть firstSub будет ? GetValue(firstSubRef).
3. Пусть restSub будет ? SubstitutionEvaluation из TemplateSpans.
4. Утверждено: restSub - это список.
5. Вернуть список, первым элементом которого является firstSub, а последующие элементы - элементами restSub. restSub не может содержать элементов.

 

 

Дополнительные цепи

Примечание

Необязательная цепочка — это цепочка из одного или нескольких обращений к свойствам и вызовов функций, первая из которых начинается с токена ?..

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

OptionalExpression :

MemberExpression OptionalChain

1. Пусть baseReference будет результатом вычисления MemberExpression.
2. Пусть baseValue будет ? GetValue(baseReference).
3. Если baseValue является undefined(не определено) или равно null, тогда
   а. Вернуть undefined.
4. Верните результат выполнения ChainEvaluation для OptionalChain с аргументами baseValue и baseReference.

 

OptionalExpression :

CallExpression OptionalChain

1. Пусть baseReference будет результатом вычисления CallExpression.
2. Пусть baseValue будет ? GetValue(baseReference).
3. Если baseValue является undefined(не определено) или равно null, тогда
   а. Вернуть undefined.
4. Верните результат выполнения ChainEvaluation для OptionalChain с аргументами baseValue и baseReference.

 

OptionalExpression :

OptionalExpression OptionalChain

1. Пусть baseReference будет результатом вычисления OptionalExpression.
2. Пусть baseValue будет ? GetValue(baseReference).
3. Если baseValue является undefined(не определено) или равно null, тогда
   а. Вернуть undefined.
4. Верните результат выполнения ChainEvaluation для OptionalChain с аргументами baseValue и baseReference.

 

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

С параметрами baseValue и baseReference.

OptionalChain : ?. Arguments

1. Пусть thisChain будет этой OptionalChain.
2. Пусть tailCall будет IsInTailPosition(thisChain).
3. Вернуться? EvaluateCall(baseValue, baseReference, Arguments, tailCall).

 

OptionalChain : ?. [ Expression ]

1. Если код, соответствующий этому OptionalChain, является кодом строгого режима, пусть strict будет истинным - true; иначе пусть strict будет ложным - false.
2. Вернуть ? EvaluatePropertyAccessWithExpressionKey(baseValue, Expression, strict).

 

OptionalChain : ?. IdentifierName

1. Если код, соответствующий этому OptionalChain, является кодом строгого режима, пусть strict будет истинным - true; иначе пусть strict будет ложным - false.
2. Вернуть ? EvaluatePropertyAccessWithIdentifierKey(baseValue, IdentifierName, strict).

 

OptionalChain : ?. PrivateIdentifier

1. Пусть bv будет ? RequireObjectCoercible(baseValue).
2. Пусть fieldNameString будет StringValue для PrivateIdentifier.
3. Вернуть ! MakePrivateReference(bv, fieldNameString).

 

OptionalChain : OptionalChain Arguments

1. Пусть optionalChain будет OptionalChain.
2. Пусть newReference будет ? ChainEvaluation из optionalChain с аргументами baseValue и baseReference.
3. Пусть newValue будет ? GetValue(newReference).
4. Пусть thisChain будет этой OptionalChain.
5. Пусть tailCall будет IsInTailPosition(thisChain).
6. Вернуть ? EvaluateCall(newValue, newReference, Arguments, tailCall).

 

OptionalChain : OptionalChain [ Expression ]

1. Пусть optionalChain будет OptionalChain.
2. Пусть newReference будет ? ChainEvaluation из optionalChain с аргументами baseValue и baseReference.
3. Пусть newValue будет ? GetValue(newReference).
4. Если код, совпадающий с этим OptionalChain, является кодом строгого режима, пусть strict будет истинным - true; иначе пусть strict будет ложным - false.
5. Вернуть ? EvaluatePropertyAccessWithExpressionKey(newValue, Expression, strict).

 

OptionalChain : OptionalChain . IdentifierName

1. Пусть optionalChain будет OptionalChain.
2. Пусть newReference будет ? ChainEvaluation из optionalChain с аргументами baseValue и baseReference.
3. Пусть newValue будет ? GetValue(newReference).
4. Если код, совпадающий с этим OptionalChain, является кодом строгого режима, пусть strict будет истинным - true; иначе пусть strict будет ложным - false.
5. Вернуть ? EvaluatePropertyAccessWithIdentifierKey(newValue, IdentifierName, strict).

 

OptionalChain : OptionalChain . PrivateIdentifier

1. Пусть optionalChain будет OptionalChain.
2. Пусть newReference будет ? ChainEvaluation из optionalChain с аргументами baseValue и baseReference.
3. Пусть newValue будет ? GetValue(newReference).
4. Пусть nv будет ? RequireObjectCoercible(newValue).
5. Пусть fieldNameString будет StringValue для PrivateIdentifier.
6. Вернуть ! MakePrivateReference(nv, fieldNameString).

 

Вызовы import

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

ImportCall : import ( AssignmentExpression )

1. Пусть referencingScriptOrModule будет ! GetActiveScriptOrModule().
2. Пусть argRef будет результатом вычисления AssignmentExpression.
3. Пусть спецификатор specifier будет ? GetValue(argRef).
4. Пусть promiseCapability будет ! NewPromiseCapability(%Promise%).
5. Пусть specifierString будет ToString(specifier).
6. IfAbruptRejectPromise(specifierString, promiseCapability).
7. Выполните ! HostImportModuleDynamically(referencingScriptOrModule, specifierString, promiseCapability).
8. Вернуть promiseCapability.[[Promise]].

 

Помеченные шаблоны

Примечание

Помеченный шаблон — это вызов функции, аргументы которого являются производными от TemplateLiteral (13.2.8). Фактические аргументы включают объект шаблона (13.2.8.3) и значения, полученные путем оценки выражений, встроенных в TemplateLiteral.

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

MemberExpression : MemberExpression TemplateLiteral

1. Пусть tagRef будет результатом вычисления MemberExpression.
2. Пусть tagFunc будет ? GetValue(tagRef).
3. Пусть thisCall будет этим выражением MemberExpression.
4. Пусть tailCall будет IsInTailPosition(thisCall).
5. Вернуть ? EvaluateCall(tagFunc, tagRef, TemplateLiteral, tailCall).

 

CallExpression : CallExpression TemplateLiteral

1. Пусть tagRef будет результатом вычисления CallExpression.
2. Пусть tagFunc будет ? GetValue(tagRef).
3. Пусть thisCall будет этим CallExpression.
4. Пусть tailCall будет IsInTailPosition(thisCall).
5. Вернуться? EvaluateCall(tagFunc, tagRef, TemplateLiteral, tailCall).

 

Мета Свойства

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

NewTarget : new . target

1. Вернуть GetNewTarget().

 

ImportMeta : import . meta

1. Пусть module будет ! GetActiveScriptOrModule().
2. Утверждено: модуль module - это запись модуля исходного текста.
3. Пусть importMeta будет module.[[ImportMeta]].
4. Если importMeta является empty, то
   а. Установите для importMeta значение ! OrdinaryObjectCreate(null).
   b. Пусть importMetaValues будет ! HostGetImportMetaProperties(module).
   c. Для каждой записи {[[Key]], [[Value]]} p из importMetaValues выполните
      i. Выполнять ! CreateDataPropertyOrThrow(importMeta, p.[[Key]], p.[[Value]]).
   d. Выполнять ! HostFinalizeImportMeta(importMeta, module).
   е. Установите module.[[ImportMeta]] на importMeta.
   f. Вернуть importMeta.
5. Иначе,
   а. Утверждено: Type(importMeta) - это Объект.
   b. Вернуть importMeta.

 

HostGetImportMetaProperties ( moduleRecord )

Определяемая хостом абстрактная операция HostGetImportMetaProperties (Хост получить импорт мета-свойств) принимает аргумент moduleRecord (запись модуля). Он позволяет хостам предоставлять ключи и значения свойств для объекта, возвращаемого из import.meta.

Реализация HostGetImportMetaProperties должна соответствовать следующим требованиям:

  • Он должен возвращать список, значениями которого являются все записи с двумя полями, [[Key]] и [[Value]].
  • Поле [[Key]] каждой такой записи должно быть ключом свойства, то есть IsPropertyKey должен возвращать true при применении к нему.
  • Поле [[Value]] каждой такой записи должно быть значением ECMAScript.
  • Он всегда должен завершаться нормально (т. е. не возвращать внезапное завершение).

Реализация HostGetImportMetaProperties по умолчанию должна возвращать новый пустой список.

 

HostFinalizeImportMeta ( importMeta, moduleRecord )

Определяемая хостом абстрактная операция HostFinalizeImportMeta (Хост завершает импорт метаданных) принимает аргументы importMeta (объект) и moduleRecord (запись модуля). Он позволяет хостам выполнять любые необычные операции для подготовки объекта, возвращаемого из import.meta.

Большинство хостов смогут просто определить HostGetImportMetaProperties и оставить HostFinalizeImportMeta с его поведением по умолчанию. Однако HostFinalizeImportMeta обеспечивает «аварийный выход» для хостов, которым необходимо напрямую манипулировать объектом, прежде чем он подвергнется воздействию кода ECMAScript.

Реализация HostFinalizeImportMeta должна соответствовать следующим требованиям:

Реализация HostFinalizeImportMeta по умолчанию должна возвращать NormalCompletion(empty).

 

 

 

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

Стандарт ECMAScript — Раздел «13.3 Left-Hand-Side Expressions» — https://tc39.es/ecma262/#sec-left-hand-side-expressions