return when desugaring to closures
Neil Mix
nmix at pandora.com
Tue Oct 14 07:38:43 PDT 2008
On Oct 13, 2008, at 6:39 PM, Brendan Eich wrote:
> Users may be modeling closures as capturing bindings, not scope chains
> of mutable objects, one per for (let...) statement or explicitly
> braced block. If so, could we make let declaration capture this way?
> Again, I'm proceeding from real users' complaints, not idle wishes.
Are you suggesting that closures over let capture bindings in the
general case? I hope not. I think for loops are a special case,
otherwise let is not the new var. ;)
WRT for loops, it's important to remember that let provides an
alternative that wasn't possible with var. Suppose for moment we do
*not* rebind on every iteration:
for (let i = 0; i < objects.length; i++) {
let j = i;
objects[i].callback = function() {
print(j);
}
}
The syntactic overhead for such a workaround is much less than for var:
for (var i = 0; i < objects.length; i++) {
objects[i].callback = buildCallback(i);
}
function buildCallback(i) {
print(i);
}
The for/closures "bug" is definitely a newbie trap, but its pain is
not its discovery, but the difficulty of working around it. To me
this could be a winning argument against re-binding on each loop,
since re-binding precludes the (admittedly dubious) use-case of
updating inside the body:
for (let i = 0; i < 100; i++) {
if (skipAhead) {
i += 9;
continue;
}
...
}
More information about the Es-discuss
mailing list