Синтаксис Определения Функций Асинхронного Генератора
AsyncGeneratorMethod [Yield, Await] :
async [не LineTerminator здесь] * ClassElementName [?Yield, ?Await] ( UniqueFormalParameters [+Yield, +Await] ) { AsyncGeneratorBody }
AsyncGeneratorDeclaration [Yield, Await, Default] :
async [не LineTerminator здесь] function * BindingIdentifier [?Yield, ?Await] ( FormalParameters [+Yield, +Await] ) { AsyncGeneratorBody }
[+Default] async [не LineTerminator здесь] function * ( FormalParameters [+Yield, +Await] ) { AsyncGeneratorBody }
async [не LineTerminator здесь] function * BindingIdentifier [+Yield, +Await] opt ( FormalParameters [+Yield, +Await] ) { AsyncGeneratorBody }
FunctionBody [+Yield, +Await]
YieldExpression и AwaitExpression нельзя использовать в FormalParameters функции асинхронного генератора, потому что любые выражения, которые являются частью FormalParameters, оцениваются до того, как результирующий объект асинхронного генератора перейдет в возобновляемое состояние.
Абстрактные операции, относящиеся к объектам асинхронного генератора, определены в разделе 27.6.3.
Статическая семантика: РанниеОшибки — Early Errors
AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }
- Это синтаксическая ошибка, если HasDirectSuper для AsyncGeneratorMethod является true (истинно).
- Это синтаксическая ошибка, если UniqueFormalParameters Содержит YieldExpression является true (истинно).
- Это синтаксическая ошибка, если UniqueFormalParameters Содержит AwaitExpression является true (истинно).
- Это синтаксическая ошибка, если FunctionBodyContainsUseStrict для AsyncGeneratorBody является true (истинно), а IsSimpleParameterList для UniqueFormalParameters — false.
- Это синтаксическая ошибка, если какой-либо элемент BoundNames из UniqueFormalParameters также встречается в LexicallyDeclaredNames в AsyncGeneratorBody.
async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody }
async function * ( FormalParameters ) { AsyncGeneratorBody }
async function * BindingIdentifier opt ( FormalParameters ) { AsyncGeneratorBody }
- Если исходный код, соответствующий FormalParameters, является кодом строгого режима, применяются правила Early Error для UniqueFormalParameters : FormalParameters.
- Если BindingIdentifier присутствует и исходный код, соответствующий BindingIdentifier, является кодом в строгом режиме, это является синтаксической ошибкой, если строковое значение StringValue для BindingIdentifier имеет значение «eval» или «arguments«.
- Это синтаксическая ошибка, если FunctionBodyContainsUseStrict для AsyncGeneratorBody имеет значение true, а IsSimpleParameterList для FormalParameters — false.
- Это синтаксическая ошибка, если какой-либо элемент BoundNames из FormalParameters также встречается в LexicallyDeclaredNames для AsyncGeneratorBody.
- Это синтаксическая ошибка, если FormalParameters Содержат YieldExpression является true (истинно).
- Это синтаксическая ошибка, если FormalParameters Содержат AwaitExpression является true (истинно).
- Это синтаксическая ошибка, если FormalParameters Содержат SuperProperty является true (истинно).
- Это синтаксическая ошибка, если AsyncGeneratorBody Содержат SuperProperty является true (истинно).
- Это синтаксическая ошибка, если FormalParameters Содержат SuperCall является true (истинно).
- Это синтаксическая ошибка, если AsyncGeneratorBody Содержат SuperCall является true (истинно).
Семантика среды выполнения: Оценить Тело Асинхронного Генератора — EvaluateAsyncGeneratorBody
С параметрами functionObject и argumentsList (Список).
AsyncGeneratorBody : FunctionBody
1. Выполнить ? FunctionDeclarationInstantiation(functionObject, argumentsList). 2. Пусть генератор generator будет ? OrdinaryCreateFromConstructor(functionObject, "%AsyncGeneratorFunction.prototype.prototype%", «[[AsyncGeneratorState]], [[AsyncGeneratorContext]], [[AsyncGeneratorQueue]], [[GeneratorBrand]]»). 3. Установите generator.[[GeneratorBrand]] на empty (пустой). 4. Выполнить ! AsyncGeneratorStart(generator, FunctionBody). 5. Вернуть Completion { [[Type]]: return, [[Value]]: generator, [[Target]]: empty }.
Семантика среды выполнения: Создание экземпляра функционального объекта асинхронного генератора — InstantiateAsyncGeneratorFunctionObject
С параметрами scope и privateScope.
AsyncGeneratorDeclaration : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody }
1. Пусть имя name будет строковым значением StringValue для BindingIdentifier. 2. Пусть sourceText будет исходным текстом, совпадающим с AsyncGeneratorDeclaration. 3. Пусть F будет! OrdinaryFunctionCreate(%AsyncGeneratorFunction.prototype%, sourceText, FormalParameters, AsyncGeneratorBody, non-lexical-this, scope, privateScope). 4. Выполнить ! SetFunctionName(F, name). 5. Пусть прототип prototype будет ! OrdinaryObjectCreate(%AsyncGeneratorFunction.prototype.prototype%). 6. Выполнить ! DefinePropertyOrThrow(F, "prototype", PropertyDescriptor {[[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false} ". 7. Вернуть F.
AsyncGeneratorDeclaration : async function * ( FormalParameters ) { AsyncGeneratorBody }
1. Пусть sourceText будет исходным текстом, совпадающим с AsyncGeneratorDeclaration. 2. Пусть F будет OrdinaryFunctionCreate(%AsyncGeneratorFunction.prototype%, sourceText, FormalParameters, AsyncGeneratorBody, non-lexical-this, scope, privateScope). 3. Выполните SetFunctionName(F, "default"). 4. Пусть прототип prototype будет ! OrdinaryObjectCreate(%AsyncGeneratorFunction.prototype.prototype%). 5. Выполните DefinePropertyOrThrow(F, "prototype", PropertyDescriptor {[[Значение]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false}). 6. Верните F.
Анонимное объявление AsyncGeneratorDeclaration может происходить только как часть объявления export default
(экспорта по умолчанию).
Семантика среды выполнения: Создание экземпляра выражения функции асинхронного генератора — InstantiateAsyncGeneratorFunctionExpression
С необязательным параметром name.
AsyncGeneratorExpression : async function * ( FormalParameters ) { AsyncGeneratorBody }
1. Если имя name отсутствует, установите для имени name значение "". 2. Пусть область видимости scope будет LexicalEnvironment текущего контекста выполнения. 3. Пусть privateScope будет PrivateEnvironment текущего контекста выполнения. 4. Пусть sourceText будет исходным текстом, совпадающим с AsyncGeneratorExpression. 5. Пусть закрытие closure будет ! OrdinaryFunctionCreate(%AsyncGeneratorFunction.prototype%, sourceText, FormalParameters, AsyncGeneratorBody, non-lexical-this, scope, privateScope). 6. Выполните SetFunctionName(closure, name). 7. Пусть прототип prototype будет ! OrdinaryObjectCreate(%AsyncGeneratorFunction.prototype.prototype%). 8. Выполнить ! DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor {[[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false} ». 9. Вернуть closure.
AsyncGeneratorExpression : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody }
1. Утверждено: имя name не представлено. 2. Установите для имени name строковое значение StringValue для BindingIdentifier. 3. Пусть область видимости scope будет LexicalEnvironment текущего контекста выполнения. 4. Пусть funcEnv будет ! NewDeclarativeEnvironment(scope). 5. Выполнить ! funcEnv.CreateImmutableBinding(name, false). 6. Пусть privateScope будет PrivateEnvironment текущего контекста выполнения. 7. Пусть sourceText будет исходным текстом, совпадающим с AsyncGeneratorExpression. 8. Пусть закрытие closure будет ! OrdinaryFunctionCreate(%AsyncGeneratorFunction.prototype%, sourceText, FormalParameters, AsyncGeneratorBody, non-lexical-this, funcEnv, privateScope). 9. Выполнить ! SetFunctionName(closure, name). 10. Пусть прототип prototype будет ! OrdinaryObjectCreate(%AsyncGeneratorFunction.prototype.prototype%). 11. Выполняйте ! DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor {[[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false} ». 12. Выполнить ! funcEnv.InitializeBinding(name, closure). 13. Вернуть closure.
На BindingIdentifier в AsyncGeneratorExpression можно ссылаться изнутри AsyncGeneratorBody AsyncGeneratorExpression, чтобы код генератора мог вызывать себя рекурсивно. Однако, в отличие от AsyncGeneratorDeclaration, на BindingIdentifier в AsyncGeneratorExpression нельзя ссылаться, и это не влияет на область, содержащую AsyncGeneratorExpression.
Семантика времени выполнения: Оценка — Evaluation
AsyncGeneratorExpression : async function * BindingIdentifier opt ( FormalParameters ) { AsyncGeneratorBody }
1. Вернуть InstantiateAsyncGeneratorFunctionExpression из AsyncGeneratorExpression.
Информационные ссылки
Стандарт ECMAScript — Раздел «15.6 Async Generator Function Definitions» — https://tc39.es/ecma262/#sec-async-generator-function-definitions