On Feb 2, 2012, at 5:07 PM, Jason Orendorff wrote:

> On Thu, Feb 2, 2012 at 5:52 PM, Allen Wirfs-Brock <[email protected]> 
> wrote:
>> Unfortunately, having thought about it a bit since the meeting, I'm less
>> convinced. We didn't look too deeply at possible capture scenarios such as:
>> 
>> let geti;
>> for (let i=(geti = function() {return i},expr), expr, incr = function(i++),
>> decr=function(i--), cmp=function(){return i<n}; cmp();incr()) {
>>        let j=i;
>>        i +=10;
>>        decr();
>>        ...
>>        If (j+-9 !== i) ...
>>        ...
>> }
> 
> What?! We should not reward people writing code like that.
> 
> I would be fine with the initializer-expression not being in the scope
> of i at all.

No reward, it is simply what the current syntax permits, and it is important 
that semantics are consistently applied.  The initialization semantics I assume 
here are exactly the same that would apply if if the let clause  of the for was 
pulled out and used as a standalone statement. In general, excluding i from the 
visibility of the initializer expression would prevent writing recursive 
functions definitions such as:

   const fact = function (n) {return n<=1 ? 1 : n*fact(n-1)};

for-in works well with a per iteration binding because there is no header code 
that runs between iterations.  The various desugarings that have been proposed 
to provide a fresh copy for each iteration of this form of for work for 
propagating simple values between the header and each iteration but not for 
closure captures.

Plus, the desugarings aren't things that are really suitable for teaching the 
semantics to everyday JS programmers.  You instead have to say something like:

Ok, this is really complicated but here goes.  For each let/const declared in 
the for header, a fresh variable is located in the loop body for each iteration 
of the loop. However, the values of the loop variables are automatically copied 
from the previous iteration into the next iterations.  This means that basic 
expression operator will work in the loop header pretty much like you would 
expect.  But be careful if you use any function expressions in the for header 
because the loop variables they reference may not be from the current iteration 
and any changes to loop variable they make may not have the effect you 
intended.  But, hey you probably shouldn't do those things so it really doesn't 
matter what it really does.

Allen




_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to