2016-07-21 6 views
0
for (let i = 0; i < 2; i ++){ 
    console.log('inner',i); 
} 
console.log('**************'); 
i =-1; 
if(i < 2) { 
    console.log('inner',i); 
    i = i +1; 
    if(i < 2){ 
     console.log('inner',i); 
     i = i +1; 
     if(i < 2){ 
      console.log('inner',i); 
      i = i +1; 
     } else { 
      return ; 
     } 
    } else { 
     return ; 
    } 
} 

Der obige Code ist korrekt.Warum ist das `i` nicht in Javascript ES6 definiert?

Dies ist das Ergebnis.

inner 0
inner 1
**************
inner -1
inner 0
inner 1

Wenn ich den folgenden Code schrieb, tritt dieser Fehler auf.
Die für

Der Fehler

console.log('inner',i);
^ ReferenceError: i is not defined

for (let i = 0; i < 2; i ++){ 

    console.log('inner',i); // i is not defined 
    let i = 100; 
} 
console.log('**************'); 
i =-1; 
if(i < 2) { 
    console.log('inner',i); // i is not defined 
    let i = 100; 
    i = i +1; 
    if(i < 2){ 
     console.log('inner',i); 
     i = i +1; 
     if(i < 2){ 
      console.log('inner',i); 
      i = i +1; 
     } else { 
      return ; 
     } 
    } else { 
     return ; 
    } 
} 
+3

'let' hat einen Block Umfang, so dass ich diese Erklärung erraten nach der Anmeldung kommt, so dass undifined wird. – Jai

+0

Wenn Sie von Javascript und den ECMA-Standards sprechen, ist es wichtig, die Implementierung zu beachten. Was verwenden Sie, um das Javascript auszuführen? (Ist es webbasiert? Können wir Chrome mit V8 erwarten? Verwenden wir Rhino?) –

+0

Dies könnte helfen: http://stackoverflow.com/questions/762011/let-keyword-vs-var-keyword – Rajesh

Antwort

2

The standard sagt ", lassen und const Deklarationen Variablen definieren, die auf die laufenden Ausführungskontext des LexicalEnvironment scoped werden. Die Variablen erstellt werden, wenn ihre Lexical Environment wird instanziiert, aber es kann nicht darauf zugegriffen werden, bis die LexicalBinding der Variablen ausgewertet wurde. "

Wenn der Block

{        // 0 
    console.log('inner',i); // 1 
    let i = 100;    // 2 
} 

ausgeführt wird:

  • Zeile 0: die lexikalische Umgebung instanziiert wird, was bedeutet, dass die Variable i an diesem Punkt erzeugt wird.
  • Zeile 1: Die Verwendung von i bezieht sich hier auf die Variable i in der neu instanziierten lexikalischen Umgebung. Da jedoch die lexikalische Bindung in Zeile 2 noch nicht ausgeführt wurde, ist es ein Fehler, auf diese Variable zuzugreifen.
+0

Meine frühere Antwort war völlig falsch. Ich habe es bearbeitet, um korrekt zu sein. –

0

Wie @Jai erwähnt, ist das let Schlüsselwort wird nur innerhalb des Blocks Bereich definiert es erstellt wurde der auf den Code aussehen So lassen.

for (let i = 0; i < 2; i ++){ // i is declared using let so it can only be used inside of this for loop 

    console.log('inner',i); 
    let i = 100; // Here you're re-declaring i for some reason? This could be the cause of i being undefined on the above line 
} 
console.log('**************'); 
i =-1; // Here you're trying to access i outside the for loop, but since it's outside it's not defined 
if(i < 2) { 
    console.log('inner',i); // i is not defined, same reason as previously 
    let i = 100; // However here you declare i again, so the next console.log will not cause an error 
    i = i +1; 
    if(i < 2){ 
     console.log('inner',i); 
     i = i +1; 
     if(i < 2){ 
      console.log('inner',i); 
      i = i +1; 
     } else { 
      return ; 
     } 
    } else { 
     return ; 
    } 
} 

Da es aussieht wie du i verwenden möchten in der gesamten Datei konnte man es nur global deklarieren statt:

var i = 0; 
for (; i < 2; i ++){ 

    console.log('inner',i); 
    i = 100; 
} 
console.log('**************'); 
i =-1; 
if(i < 2) { 
    console.log('inner',i); 
    i = 100; 
    i = i +1; 
    if(i < 2){ 
     console.log('inner',i); 
     i = i +1; 
     if(i < 2){ 
      console.log('inner',i); 
      i = i +1; 
     } else { 
      return ; 
     } 
    } else { 
     return ; 
    } 
} 
0
  • 1/Sie nicht Rückkehr außerhalb der Funktion verwenden können.
  • 2/let definiert eine Variable in einem lokalen Bereich. Sie können nicht auf die for-Schleife zugreifen.
  • 3/Ihr Code gibt

inner

inner 100 (You defined let i = 100, used the second iteration in the for, see 4/)

**************

inner

Getestet auf http://babeljs.io

Die Lösung:

for (let i = 0; i < 2; i ++){ 
    console.log('inner',i); 
} 
console.log('**************'); 
var i = -1; // Defines i with var instead of nothing, causing i = undefined 
if(i < 2) { 
    console.log('inner',i); 
    i++; // Incrementation shortcut 
    if(i < 2){ 
     console.log('inner',i); 
     i++; 
     if(i < 2){ 
      console.log('inner',i); 
      i++; 
     } 
    } 
} 
Verwandte Themen