Skip to content

ES6 feature: Let and Const Declaration #1065

@ariya

Description

@ariya

Syntax:

Per Rev 32 (Feb 2, 2015) of the draft spec, the relevant grammar is on Section 13.2.1 on Let and Const Declarations:

LexicalDeclaration[In, Yield] :
  LetOrConst BindingList[?In, ?Yield] ;

LetOrConst :
  let
  const

BindingList[In, Yield] :
  LexicalBinding[?In, ?Yield]
  BindingList[?In, ?Yield] , LexicalBinding[?In, ?Yield]

LexicalBinding[In, Yield] :
  BindingIdentifier[?Yield] Initializer[?In, ?Yield]opt
  BindingPattern[?Yield] Initializer[?In, ?Yield]

Referred to by:

Declaration:

Declaration[Yield] :
  HoistableDeclaration _[?Yield]
  ClassDeclaration[?Yield]
  LexicalDeclaration[In, ?Yield]

StatementListItem:

StatementListItem[Yield, Return] :
  Statement[?Yield, ?Return]
  Declaration[?Yield]

Iteration:

for ( LexicalDeclaration[?Yield] Expression[In, ?Yield]opt ; Expression[In, ?Yield]opt ) Statement[?Yield, ?Return]
for ( ForDeclaration[?Yield] in Expression[In, ?Yield] ) Statement[?Yield, ?Return]

whereas:

ForDeclaration[Yield] :
  LetOrConst ForBinding[?Yield]

ForBinding[Yield] :
  BindingIdentifier[?Yield]
  BindingPattern[?Yield]

Early errors:

  • const without initializer: const x; (from Esprima 1.x)
  • for-in with multiple let identifiers: for (let x,y in z){}
  • for-in with multiple const identifiers: for (const x,y in z){}
  • for-in with let initializer: for (let i = 1 in x){}
  • for-in with const initializer: for (const i = 1 in x){}
    • More TBD

Spec:

13.2.1 Let and Const Declarations.

Relevant AST interfaces (from https://github.com/estree/estree):

interface VariableDeclaration <: Declaration {
    type: "VariableDeclaration";
    declarations: [ VariableDeclarator ];
    kind: "var";
}
extend interface VariableDeclaration {
    kind: "var" | "let" | "const";
}

See also

Note that V8 doesn't yet support various early errors for lexical declarations. In the mean time, we may need to use the generic Unexpected token... message for such an error.

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions