tc39 / ecma262

Status, process, and documents for ECMA-262
https://tc39.es/ecma262/
Other
15.03k stars 1.28k forks source link

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

Closed rkirsling closed 5 years ago

rkirsling commented 5 years ago

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:

ljharb commented 5 years ago

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.

rkirsling commented 5 years ago

Made a concrete proposal in #1393.

littledan commented 5 years ago

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

anba commented 5 years ago

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?)

syg commented 5 years ago

@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.

allenwb commented 5 years ago

@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.