Redefining a let variable inside a for loop scope doesn't work?

Allen Wirfs-Brock allen at
Fri Jul 15 14:18:41 UTC 2016

This is by design.  ECMAScript block scoped declarations generally conform to the principle that within a single block or statement a name may have only a single binding. For example, 

let x=0;
  let x = x+1;  //access to uninitialized variable error because both the RHS and LHS refer to the inner x
                     //which has not yet been initialized when the RHS is evaluated


The same principle also applies to 
let n = {a:[]};
for (let n of n.a) ;

although the actual scoping of the `for` statement is more complex. Basically, such `for` statements consider all names bound by the `let` part of of the `for` header to be undefined while the `of` expression is being evaluated. 

This is done to avoid any confusion about which `n` the expression references. Such confusion is avoid by all references to the `let` bound names from the RHS errors.


More information about the es-discuss mailing list