return when desugaring to closures

Brendan Eich brendan at mozilla.com
Mon Oct 13 15:34:37 PDT 2008


On Oct 13, 2008, at 1:16 PM, David-Sarah Hopwood wrote:

> In the "i++", which iteration's 'i' is the LeftHandSideExpression
> referring to? Or does this expand to something like:
>
>  let ($i = 0) {
>    for (;
>         let (i = $i) {i < 10};
>         let (i = $i) {{i++;} $i = i;}} {
>      let (i = $i) {...};
>    }
>  }
>
> ? That would work as I think you want, but it seems a bit magical to  
> me.

On the contrary, what's magical is when one stores i in elements of an  
array, or calls setTimeout (example in https://bugzilla.mozilla.org/show_bug.cgi?id=449811) 
, and the results are all the last value of the loop variable.

This has been a frequent source of confusion and complaints -- a bug,  
in short.

Doing it the way Mark proposes fixes the bug, and has no other bad  
effects that I can see (but we'll have to implement and user-test to  
be sure).

> I could be convinced, though -- do you want to try and make the case  
> for
> why there should be a fresh variable per iteration with some concrete
> examples?

https://bugzilla.mozilla.org/show_bug.cgi?id=449811

/be


More information about the Es-discuss mailing list