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:
FIXME (and a bug)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.
Most helpful comment
It seems exceedingly odd to me that:
works but
errors.