Allen Wirfs-Brock wrote:
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.

Ok, alternative approach:

for (let i=..., whatever; whatever2; whatever3) {
  // use i
}

be implemented as

let i=..., whatever;
while (whatever2) {
  {
    let i=forward_proxy_to(outer i);
        // a thing that touches real i, but is different object
    // use i
    i=current value of inner i; // fix inner i to the value

    // The point is, it works for closures, both from inside or
    // 'detached' since it is always the same 'i' binding
    // in the same execution context
  }
  whatever3;
}

Allen

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

Reply via email to