Saturday, May 11, 2024
47
rated 0 times [  53] [ 6]  / answers: 1 / hits: 53120  / 11 Years ago, fri, may 10, 2013, 12:00:00

ECMAScript 6's let is supposed to provide block scope without hoisting headaches. Can some explain why in the code below i in the function resolves to the last value from the loop (just like with var) instead of the value from the current iteration?



use strict;
var things = {};
for (let i = 0; i < 3; i++) {
things[fun + i] = function() {
console.log(i);
};
}

things[fun0](); // prints 3
things[fun1](); // prints 3
things[fun2](); // prints 3


According to MDN using let in the for loop like that should bind the variable in the scope of the loop's body. Things work as I'd expect them when I use a temporary variable inside the block. Why is that necessary?



use strict;
var things = {};
for (let i = 0; i < 3; i++) {
let index = i;
things[fun + i] = function() {
console.log(index);
};
}

things[fun0](); // prints 0
things[fun1](); // prints 1
things[fun2](); // prints 2


I tested the script with Traceur and node --harmony.


More From » ecmascript-6

 Answers
30

squint's answer is no longer up-to-date. In ECMA 6 specification, the specified behaviour is that in



for(let i;;){}


i gets a new binding for every iteration of the loop.



This means that every closure captures a different i instance. So the result of 012 is the correct result as of now. When you run this in Chrome v47+, you get the correct result. When you run it in IE11 and Edge, currently the incorrect result (333) seems to be produced.



More information regarding this bug/feature can be found in the links in this page;



Since when the let expression is used, every iteration creates a new lexical scope chained up to the previous scope. This has performance implications for using the let expression, which is reported here.


[#78318] Wednesday, May 8, 2013, 11 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
eliza

Total Points: 732
Total Questions: 96
Total Answers: 86

Location: Guam
Member since Fri, Jun 18, 2021
3 Years ago
;