2016-04-18 12 views
4

Während x keine Konstante ist, wie der folgende Code ohne Fehler ausgeführt wird?Verwenden von const in es6 für Schleife

for (const x of [1,2,3]){ 
console.log(x); 
} 
+0

versuchen zu tun x = x + 1 in der für mich gehen lassen, wie es –

+0

In IE11 geht I * einen Fehler hat *, wenn ich es laufen: „Const initialisiert werden muss“. – nnnnnn

+0

'Syntaxerror: invalid für/in Links side' auf Firefox – Oriol

Antwort

6

Es auf kompatiblen Browsern wie Chrome funktioniert, weil sie eine neue, unterschiedliche, konstante Größe bei jeder Iteration erstellen:

var arr = []; 
for (const x of [1,2,3]) 
    arr.push(() => x); 
arr.map(f => f()); // [1,2,3] on Chrome 

einige nicht-kompatiblen Browsern wiederverwenden die gleiche Variable statt:

var arr = []; 
for (let x of [1,2,3]) 
    arr.push(() => x); 
arr.map(f => f()); // [3,3,3] on non-compliant browsers 
Deshalb

, werfen sie einen Fehler, wenn in dem obigen Beispiel Sie const verwenden.


Runtime Semantics: ForIn/OfBodyEvaluation sagt:

  1. Repeat
    1. Else
      1. Assert: lhsKind is lexicalBinding.
      2. Assert: lhs is a ForDeclaration.
      3. Let iterationEnv be NewDeclarativeEnvironment (oldEnv).
      4. Perform BindingInstantiation for lhs passing iterationEnv as the argument.

So jede Iteration eine neue Bindung schaffen sollte. Chrome ist korrekt.

Verwandte Themen