Closed rkirsling closed 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.
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.
Annex B.3.5, VariableStatements in Catch Blocks, says:
That is, we allow var-redeclaration of a non-destructured catch parameter...
...except in the particular case where the var declaration is a for-of initializer.
(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)