On Jun 12, 2014, at 12:50 PM, Michael Zhou wrote:
> In other words, is
> for (let i = 0; i < 10; i++) {
> let i;
> }
>
> legal? I feel it is, but I'm not sure if the specs has made that clear.
> Thanks!
The above is legal according to the current ES6 spec. draft. The let in the
loop body block shadows the per iteration binding of i.
You can think of the body of a 'let i' for loops as desugaring into something
like:
let $$lastIteration_i = <initialization expression for i>;
{
let i = $$lastIteration_i; //create and initialize per iteration i
<test expression>;
<loop body statement>
<increment expression>;
$$lastIteration_i = i;
}
For you sample, this expands to:
let $$lastIteration_i = 0;
{
let i = $$lastIteration_i; //create and initialize per iteration i
if (!(i<10)) break;
{
let i;
}
i++;
$$lastIteration_i = i;
}
So you can see that the let i in the block simply shadows the per iteration i.
The spec. doesn't say anything explicit about this case. It just falls out of
the specified evaluation semantics of for loops.
We could consider special cases loop bodies that are BlockStatements and
statically reject those that contain declaration that shadow the loop
declarations. However, I think it is probably best to leave that sort of check
for linters to perform.
Allen
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss