+1
> On 21 Mar 2016, at 10:23, Hannes Wallnoefer <hannes.wallnoe...@oracle.com>
> wrote:
>
> Please review JDK-8151810: for-in iteration does not provide per-iteration
> scope.
>
> http://cr.openjdk.java.net/~hannesw/8151810/webrev/
>
> This issue popped up while I was implementing ES6 for-of statement. It turns
> out that like for-of, the ES5 for-in statement needs a per-iteration scope
> when used with a lexical declaration which I oversaw in my initial
> implementation of ES6 block scope.
>
> With normal for-statement this is pretty straightforward, because the spec
> says that values from the previous iteration are reused in the next
> iteration, which means that a const is actually a single const through all
> iterations of the loop. This means that we can simply clone the existing
> per-iteration scope at the end of the loop, which is what we do.
>
> However, with for-in/of per iteration scopes are independent of each other.
> Therefore, something like "for (const a of [1, 2, 3]) {...}" actually gets a
> new const for each iteration. Now we could fake it and use a cloned scope and
> reset the const using some magic, but doing that caused all kinds of problems
> (weird interaction with const declaration logic and temporal dead zone
> detection, unstable scope maps etc).
>
> So the solution I came up with is that the block that provides the scope for
> for-in statements (which is a synthetic block/block statement) registers its
> scope creator in case it has one. The for-node can then reuse the scope
> creator to create an object with the exact same property map and
> uninitialized consts/lets.
>
> Hannes