6215 Stimmen

Was ist der Unterschied zwischen der Verwendung von "let" und "var"?

ECMAScript 6 eingeführt die let Anweisung .

Ich habe gehört, dass man es als eine local Variable, aber ich bin mir immer noch nicht ganz sicher, warum sie sich anders verhält als die var Stichwort.

Was sind die Unterschiede? Wann sollte let verwendet werden anstelle von var ?

133 Stimmen

ECMAScript ist der Standard und let ist enthalten in der Entwurf der 6. Auflage und wird höchstwahrscheinlich in der endgültigen Spezifikation enthalten sein.

12 Stimmen

Véase kangax.github.io/es5-compat-table/es6 für eine aktuelle Unterstützungsmatrix der ES6-Funktionen (einschließlich let). Zum Zeitpunkt der Erstellung dieses Artikels unterstützen Firefox, Chrome und IE11 diese Funktion (obwohl ich glaube, dass die Implementierung von FF nicht ganz Standard ist).

37 Stimmen

Die längste Zeit wusste ich nicht, dass Variablen in einer for-Schleife auf die Funktion, in die sie eingeschlossen war, skaliert wurden. Ich erinnere mich, dass ich dies zum ersten Mal herausfand und dachte, es sei sehr dumm. Jetzt weiß ich allerdings, wie die beiden aus unterschiedlichen Gründen verwendet werden können und dass man in manchen Fällen eine Variable in einer for-Schleife verwenden möchte, ohne dass sie auf den Block skaliert ist.

143voto

Lcf.vs Punkte 1712

Die akzeptierte Antwort lässt einen Punkt außer Acht:

{
  let a = 123;
};

console.log(a); // ReferenceError: a is not defined

21 Stimmen

Die akzeptierte Antwort erklärt diesen Punkt in ihrem Beispiel NICHT. Die akzeptierte Antwort demonstriert dies nur in einem for Schleifeninitialisierung, wodurch der Anwendungsbereich der Einschränkungen der let . Hochgevotet.

45 Stimmen

@stimpy77 Es heißt explizit "let ist scoped to the nearest enclosing block"; muss jede Art und Weise, die Manifeste enthalten sein?

9 Stimmen

Es gab viele Beispiele, und keines davon hat die Sache richtig veranschaulicht Ich hätte sowohl die akzeptierte Antwort als auch diese hochgestuft?

111voto

Hasan Sefa Ozalp Punkte 4296

Ganz einfach ausgedrückt,

for (let i = 0; i < 5; i++) {
  // i accessible 
}
// i not accessible 

for (var i = 0; i < 5; i++) {
  // i accessible 
}
// i accessible 

Sandkasten zum Herumspielen ↓

Edit let vs var

69voto

vlio20 Punkte 8264

Hier ist ein Beispiel für den Unterschied zwischen den beiden (die Unterstützung für Chrome hat gerade begonnen):
enter image description here

Wie Sie sehen können, ist die var j Variable hat immer noch einen Wert außerhalb des Bereichs der for-Schleife (Block Scope), aber die let i außerhalb des Bereichs der for-Schleife undefiniert ist.

"use strict";
console.log("var:");
for (var j = 0; j < 2; j++) {
  console.log(j);
}

console.log(j);

console.log("let:");
for (let i = 0; i < 2; i++) {
  console.log(i);
}

console.log(i);

68voto

Alireza Punkte 92209

Der Hauptunterschied ist die Umfang Unterschied, während lassen Sie kann nur innerhalb der Umfang es wird deklariert, wie in der for-Schleife, var kann zum Beispiel außerhalb der Schleife aufgerufen werden. Aus der Dokumentation in MDN (Beispiele auch von MDN):

lassen Sie ermöglicht es Ihnen, Variablen zu deklarieren, die auf den Block, die Anweisung oder den Ausdruck beschränkt sind, in dem sie verwendet werden. Dies ist anders als die var Schlüsselwort, das eine Variable global oder lokal für eine gesamte Funktion unabhängig vom Blockbereich definiert.

Variablen, die von lassen Sie haben als Geltungsbereich den Block, in dem sie definiert sind, sowie alle darin enthaltenen Unterblöcke. Auf diese Weise, lassen Sie funktioniert sehr ähnlich wie var . Der Hauptunterschied besteht darin, dass der Anwendungsbereich einer var Variable ist die gesamte umschließende Funktion:

function varTest() {
  var x = 1;
  if (true) {
    var x = 2;  // same variable!
    console.log(x);  // 2
  }
  console.log(x);  // 2
}

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

Auf der obersten Ebene der Programme und Funktionen, lassen Sie im Gegensatz zu var wird keine Eigenschaft auf dem globalen Objekt erstellt. Zum Beispiel:

var x = 'global';
let y = 'global';
console.log(this.x); // "global"
console.log(this.y); // undefined

Wenn let innerhalb eines Blocks verwendet wird, beschränkt sich der Geltungsbereich der Variablen auf diesen Block. Beachten Sie den Unterschied zwischen var deren Geltungsbereich innerhalb der Funktion liegt, in der sie deklariert wird.

var a = 1;
var b = 2;

if (a === 1) {
  var a = 11; // the scope is global
  let b = 22; // the scope is inside the if-block

  console.log(a);  // 11
  console.log(b);  // 22
} 

console.log(a); // 11
console.log(b); // 2

Vergessen Sie auch nicht, dass es sich um eine ECMA6-Funktion handelt, die noch nicht vollständig unterstützt wird. Daher ist es besser, sie mit Babel usw. in ECMA5 zu übertragen. babel website

0 Stimmen

Ich weiß nicht, ob das letzte Beispiel zutreffend ist. Denn wenn man es nicht aus einer Funktion, sondern direkt aus der Befehlszeile aufruft, wird es immer noch als Teil der gleichen Funktion betrachtet. Also, wenn Sie es von außerhalb einer Funktion aufgerufen, sollte es nicht auf die gleiche Weise verhalten.

64voto

olliej Punkte 34163

Es gibt einige subtile Unterschiede - let Scoping verhält sich mehr wie das Scoping von Variablen in mehr oder weniger allen anderen Sprachen.

z.B. gilt er für den umschließenden Block, sie existieren nicht, bevor sie deklariert sind, usw.

Es ist jedoch erwähnenswert, dass let ist nur ein Teil der neueren Javascript-Implementierungen und hat unterschiedliche Grade von Browserunterstützung .

14 Stimmen

Es ist auch erwähnenswert, dass ECMAScript der Standard ist und let ist enthalten in der Entwurf der 6. Auflage und wird höchstwahrscheinlich in der endgültigen Spezifikation enthalten sein.

8 Stimmen

Ich bin gerade über diese Frage gestolpert, und im Jahr 2012 ist es immer noch so, dass nur Mozilla-Browser diese Funktion unterstützen. let . Safari, IE und Chome tun dies alle nicht.

4 Stimmen

Die Idee, versehentlich einen teilweisen Blockumfang zu erstellen, ist ein guter Punkt, aber Vorsicht, let nicht hebt, um eine Variable zu verwenden, die durch eine let am Anfang Ihres Blocks definiert. Wenn Sie eine if Anweisung, die aus mehr als nur ein paar Zeilen Code besteht, können Sie vergessen, dass Sie diese Variable erst verwenden können, nachdem sie definiert wurde. GROSSER PUNKT!!!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X