2015-02-05 5 views
9

Ich spiele mit einer sinnlosen Logik herum, um ES6 besser zu verstehen, und habe ein merkwürdiges Vorkommnis bemerkt, als ich eine Konstante definiert habe.ES6 Warum kann ich eine Konstante neu zuweisen, wenn sie in einer Schleife definiert ist?

Es scheint möglich, eine konstante Zuordnung zu ändern, wenn in einer Schleife definiert:

 "use strict"; 

     for(const i=0;i<10;i++){ //seting constant in loop 
      console.log(i); //is reassigned and incremented 0,1,2,3... 
     } 


     const e = 0; //setting constant outside loop 
     for(;e<10;e++){ //cannot reassign constant 
      console.log(e); 
     } 

Ist das erwartete Verhalten und kann jemand etwas Licht auf, warum dies der Fall ist, ist Deklaration in der Schleife anders?

enter image description here


Update von Statements/const

This declaration creates a constant that can be global or local to the function in which it is declared. Constants are block-scoped.

+1

Wow, habe gerade dies in Chrome Version 40.0.2214.94 versucht und es erzeugt eine Endlosschleife, vielleicht weil die Konstante nie stummgeschaltet ist. Welchen Browser benutzen Sie? – Sarcadass

+0

Das bedeutet wahrscheinlich, Chrom hat es richtig, indem es nicht neu zugewiesen (? Aber sollte wahrscheinlich einen Fehler werfen) und hebt immer noch die Konstante. In Ihrem Fall scheint es, als ob die "const" wie "Let" funktioniert https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let#let_in_loops –

+0

In Firefox bekomme ich 'TypeError: redeclaration von var i' für das erste Beispiel – Kapep

Antwort

8

Wenn Sie eine "unveränderliche Bindung" ändern, die current draft wirft nur im strengen Modus:

Wie @kangax hingewiesen Aus, Neuzuweisung einer Konstante sollte immer werfen, seit const schafft eine "unveränderliche Bindung" mit der strict Fahne (here):

If IsConstantDeclaration of d is true, then

Call env’s CreateImmutableBinding concrete method passing dn and true as the arguments.

und then:

SetMutableBinding (N,V,S) ...

  1. Else if the binding for N in envRec is a mutable binding, change its bound value to V.
  2. Else this must be an attempt to change the value of an immutable binding so if S is true throw a TypeError exception.

jedoch Knoten nur im strikten Modus führen:

"use strict"; 

const e = 0; 
e = 42; // SyntaxError: Assignment to constant variable. 

(es ist nicht klar, warum dies ein "SyntaxError" ist) ...

const e = 0; 
e = 42; 
console.log(e); // 0 

mit Knoten v0.10.35 mit --harmony Flagge geprüft: 0 in dem nicht-strikten Modus wird die Zuordnung der konstanten stillschweigend ignoriert.

+0

Das sieht aus wie ein Bug in Node. Oder es ist nicht implementiert. Die erneute Zuweisung zu "const" sollte definitiv geworfen werden, unabhängig vom Modus. Wenn Sie sich https://people.mozilla.org/~jorendorff/es6-draft.html#sec-for-statement-runtime-semantics-labelledevaluation ansehen, sehen Sie, dass 'const' in' CreateImmutableBinding' mit S = resultiert Das ist ein TypeError, sobald die Schleife die zweite Iteration startet. – kangax

+2

Sie können auch die genaue Aufschlüsselung des Supports in unserer Kompat-Tabelle sehen - https://kangax.github.io/compat-table/es6/#const - was zeigt, dass "das Neudefinieren eines Const ein Fehler ist" in Chrome tatsächlich fehlt der moment (was OP ist, erfahre ich) – kangax

+0

@kangax: danke für das zeigen, bearbeitet. – georg