2016-07-31 2 views

Antwort

4

Diese beiden Code-Schnipsel machen genau dasselbe (und das ist in den meisten Sprachen der Fall, wie zB C, C++ und C#). Wenn die Variable bei jeder Iteration neu deklariert wurde, wurde sie nach Ihrer Logik ebenfalls neu initialisiert und würde ständig dasselbe Objekt durchlaufen. Deine Schleife wäre unendlich.

In JavaScript werden alle Variablen-Deklarationen in den Funktionsbereich verschoben; Das bedeutet, dass Sie Variablen innerhalb einer Funktion auch innerhalb von verschachtelten Schleifen deklarieren können, und sie werden nur einmal deklariert.

Link to the var documentation

Relevant SO question

Other relevant SO answer

bearbeiten mit freundlicher Genehmigung von @torazaburo:

Wenn Sie eine Variable mit einem lokalen Bereich erklären wollen (wie in einer Variablen, die nur werden definiert im aktuellen Block wie for, while oder if, können Sie den let Zustand verwenden ment:

let var1 = 123; 

Es erlaubt Ihnen auch Variablen mit dem gleichen Namen außer Kraft zu setzen, aber in einem höheren Umfang, wie in diesem Beispiel aus der Dokumentation erklärt:

function letTest() { 
    let x = 1; 
    if (true) { 
     let x = 2; // different variable 
     console.log(x); // 2 
    } 
    console.log(x); // 1 
} 

die vollständige Dokumentation finden (und Beispiele) here.

+0

Es wäre sehr nützlich, in diese Antwort zu schreiben, wie "let" in diesem Kontext funktioniert. –

2

Der bevorzugte Ansatz im Jahr 2016 ist die Variable in der Schleife Kopf zu erklären, mit let:

for (let i = 0; i < max; i++) { } 
    ^^^ 

zwischen diesem und anderen Ansätzen wahrscheinlich minimaler Unterschied in der Leistung ist, aber es gibt große Vorteile in Bezug auf dem Robustheit und Klarheit Ihres Codes.

Zuerst mit let ist i lokal auf das for Konstrukt, so kann es nicht „auslaufen“ oder eine anderes i in einem äußeren Umfang ändern.

Zweitens, und vielleicht noch wichtiger, wird für jede Iteration der Schleife eine neue Version von i erstellt. In technischer Hinsicht, "erhalten Sie eine neue Bindung für jede Iteration, wenn Sie eine Variable deklarieren lassen" (siehe this excellent article). Dies löst das uralte Problem der Schließungen, die in der For-Schleife mit dem Endwert i erstellt wurden.Wir können jetzt schreiben Sie einfach

for (let i = 0; i < 10; i++) { 
    setTimeout(() => alert(i), i * 1000); 
} 

statt mit etwas plump Behelfslösung wie

for (var i = 0; i < 10; i++) { 
    (function(i) { 
    setTimeout(() => alert(i), i * 1000); 
    }(i)); 
} 

, die das Thema unzähliger Fragen auf SO hier gewesen zu tun, und die viele von Ihnen haben verschwendet viel zu viele Gehirnzyklen lernen.

Verwandte Themen