Ecma262: Annex B.3.5: Should we stop making for-of a special case?

Created on 4 Jan 2019  路  6Comments  路  Source: tc39/ecma262

Annex B.3.5, VariableStatements in Catch Blocks, says:

It is a Syntax Error if any element of the BoundNames of CatchParameter also occurs in the VarDeclaredNames of Block unless CatchParameter is CatchParameter : BindingIdentifier and that element is only bound by a VariableStatement, the VariableDeclarationList of a for statement, the ForBinding of a for-in statement, or the BindingIdentifier of a for-in statement.

That is, we allow var-redeclaration of a non-destructured catch parameter...

try {} catch (e) { var e; }

...except in the particular case where the var declaration is a for-of initializer.

try {} catch (e) { for (var e of whatever) {} }

(_Note that this behavior applies equally to sloppy and strict modes._)

Based on some earlier discussion I see in #150, it seems like the motivation here was to prohibit as much as possible without jeopardizing web compatibility. Still, if the for-of case is neither easy to remember nor trivial to implement, I wonder whether it provides concrete benefit to anyone. Should we simplify it away?


Current status in the major engines:

  • V8 and SpiderMonkey fully implement Annex B.3.5 and have special codepaths for the for-of case
  • JSC implements everything but the for-of case, for which it has a FIXME (and a bug)
  • ChakraCore allows any var-redeclaration of a catch parameter, destructured or otherwise
has consensus normative change question

Most helpful comment

It seems exceedingly odd to me that:

function f(e) { for (var e of whatever) { } }

works but

try {} catch (e) { for (var e of whatever) {} }

errors.

All 6 comments

It seems exceedingly odd to me that:

function f(e) { for (var e of whatever) { } }

works but

try {} catch (e) { for (var e of whatever) {} }

errors.

Made a concrete proposal in #1393.

This was pretty complicated to implement in V8, and came later than other parts of lexical scoping. Does anyone know the motivation? cc @allenwb @waldemarhorwat

The relevant bug report and meeting notes also don't mention why for-of was excluded. (Maybe only the web-compatibility necessary exclusion was considered to be necessary at the point in time?)

@anba That sounds about right. I don't have anything written to point to, but my recollection was basically that since for-of was a new feature, there was no reason to give it an extra allowance.

@syg Yes! That is correct. During ES6 development there was general consensus within TC39 that "undesirable" Annex B behaviors would not be added to new features.

Was this page helpful?
0 / 5 - 0 ratings