No! We have a standing agreement to get rid of the awful,
lazy-grammar-reuse error in ES1 that allows an initializer in for(var
x=i in o). We do not want this at all for 'let' in either for-in or for-of.
I think we should break unconditionally and forbid =i in for(var x=i in
o) too, but that is a separate issue. This botch in grammar factoring is
a (bad) sunk cost that has zero bearing on the fresh let binding per
iteration idea. It's terrible anti-precedent. Just say no.
/be
Allen Wirfs-Brock <mailto:[email protected]>
January 30, 2012 6:09 PM
Here is valid ES6 for-in statement:
for (let p=alert("initializing p"+p) in [0,1]) alert(p);
Each iteration gets a fresh p, but does it produce three alerts saying:
Initializing p
0
1
or four alerts saying
Initializing p
0
Initializing p
1
I would expect the first alternative.
However, taking the first alternative, what happens for
let p="outer";
for (let p=alert("initializing p"+p) in [0,1]) alert(p);
Is the first alert: initializing outer
or does it throw a reference error for a temporal dead zone violation?
I would expect the reference error.
Essentially the for-in is conceptually wrapped with a block that has
an uninitialized binding for p. The initializer of the let declaration
is evaluated once in the scope of that block and then the value is
discarded because it is inaccessible. For each iterations, a fresh
block is created containing a binding for p that is initialized to the
current iteration key and then the statement is evaluated in the scope
of that block.
Thoughts?
Allen
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss