Within a generator body Arrow function formals treat yield as keyword but function declarations and expressions do not

# Ian Halliday (10 years ago)

Is this intentional?

14.1 Function Definitions

FunctionDeclaration[Yield, Default] : function BindingIdentifier[?Yield] ( FormalParameters ) { FunctionBody } [+Default] function ( FormalParameters ) { FunctionBody }

FunctionExpression : function BindingIdentifieropt ( FormalParameters ) { FunctionBody }

14.2 Arrow Function Definitions

When the production ArrowParameters[Yield] : CoverParenthesizedExpressionAndArrowParameterList[?Yield] is recognized the following grammar is used to refine the interpretation of CoverParenthesizedExpressionAndArrowParameterList: ArrowFormalParameters[Yield, GeneratorParameter] : ( StrictFormalParameters[?Yield, ?GeneratorParameter] )

Following the production rules for StrictFormalParameters and FormalParameters you can end up at SingleNameBinding

SingleNameBinding[Yield, GeneratorParameter] : [+GeneratorParameter] BindingIdentifier[Yield] Initializer[In]opt [~GeneratorParameter] BindingIdentifier[?Yield] Initializer[In, ?Yield]opt

This looks like it suggests following:

var yield; function* gf() { function f(yield = yield) { } // valid parse, both yields are identifiers, second binds to the global var var f = function (yield = yield) { }; // same deal var a = (yield = yield) => { }; // first yield is treated as keyword, doesn't parse, second is treated as identifier and again binds to the global var }

Binding to the global var in the default argument expressions is weird and perhaps confusing but acceptable I suppose.

The inconsistency of the formal name treatment between functions and arrow functions feels wrong to me given that the formal names are created in non-generator scopes.

Ian