Was ist der Unterschied zwischen "let" und "var"?
ECMAScript 6 eingeführt die lassen
- Anweisung.
Ich habe gehört, dass es beschrieben werden als "lokale" Variablen, aber ich bin mir noch nicht ganz sicher, wie es verhält sich anders als die var
Stichwort.
Was sind die Unterschiede? Wann sollte let
verwendet werden var
?
ECMAScript ist der standard und
Siehe kangax.github.io/es5-compat-table/es6 für eine aktuelle support-matrix von ES6-features (u. A. lassen). Zu der Zeit des Schreibens Firefox, Chrome und IE11 alle Unterstützung, die es (obwohl ich glaube, dass FF die Umsetzung ist nicht ganz standard).
Für die längste Zeit, die ich wusste nicht, dass die vars in einer for-Schleife wurden, eingeschränkt auf die Funktion, die es eingewickelt war. Ich erinnere mich, herauszufinden diese zum ersten mal und dachte, es war sehr dumm. Ich sehe etwas Strom, obwohl Sie wissen jetzt, wie die beiden könnten verwendet werden, ffor anderen Grund, und, wie in einigen Fällen müssen Sie vielleicht eigentlich möchten, verwenden Sie eine Variable in einer for-Schleife und habe es nicht, eingeschränkt auf den block.
Als ES6-feature-Unterstützung verbessert, die Frage über das ES6 Annahme verlagert den Fokus von der feature-Unterstützung der performance-Unterschiede. Als solche, hier ist eine Seite, die ich gefunden benchmarking performance-Unterschiede zwischen den ES6 und ES5. Denken Sie daran, dies wird wahrscheinlich ändern im Laufe der Zeit als die Motoren Optimierung für die ES6-code.
Dies ist eine sehr gute Lektüre wesbos.com/javascript-scoping
let
ist eingeschlossen in die 6. Ausgabe-Entwurf und wird höchstwahrscheinlich in die endgültige Spezifikation.Siehe kangax.github.io/es5-compat-table/es6 für eine aktuelle support-matrix von ES6-features (u. A. lassen). Zu der Zeit des Schreibens Firefox, Chrome und IE11 alle Unterstützung, die es (obwohl ich glaube, dass FF die Umsetzung ist nicht ganz standard).
Für die längste Zeit, die ich wusste nicht, dass die vars in einer for-Schleife wurden, eingeschränkt auf die Funktion, die es eingewickelt war. Ich erinnere mich, herauszufinden diese zum ersten mal und dachte, es war sehr dumm. Ich sehe etwas Strom, obwohl Sie wissen jetzt, wie die beiden könnten verwendet werden, ffor anderen Grund, und, wie in einigen Fällen müssen Sie vielleicht eigentlich möchten, verwenden Sie eine Variable in einer for-Schleife und habe es nicht, eingeschränkt auf den block.
Als ES6-feature-Unterstützung verbessert, die Frage über das ES6 Annahme verlagert den Fokus von der feature-Unterstützung der performance-Unterschiede. Als solche, hier ist eine Seite, die ich gefunden benchmarking performance-Unterschiede zwischen den ES6 und ES5. Denken Sie daran, dies wird wahrscheinlich ändern im Laufe der Zeit als die Motoren Optimierung für die ES6-code.
Dies ist eine sehr gute Lektüre wesbos.com/javascript-scoping
InformationsquelleAutor TM. | 2009-04-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
let
können auch verwendet werden, um zu vermeiden, Probleme mit den Verschlüssen. Es bindet frisches Wert, statt einen alten Verweis, wie gezeigt in den Beispielen unten.DEMO
Obige Code zeigt eine klassische JavaScript-closure-problem. Verweis auf die
i
variable gespeichert wird im click-handler Schließung, eher als der tatsächliche Wert desi
.Jeder einzelne Klick-handler auf das gleiche Objekt beziehen, weil es nur ein Zähler-Objekt, das hält 6 so erhalten Sie sechs auf jeder klicken.
Allgemeine Problemumgehung ist, um wickeln Sie diesen in eine anonyme Funktion auf und übergeben
i
als argument. Solche Probleme können vermieden werden jetzt durchlet
stattvar
wie gezeigt im code unten.DEMO (Getestet in Chrome und Firefox 50)
IE 11 unterstützt
let
, aber es Warnungen, "6" für alle Tasten. Hast du irgendeine Quelle sagen, wielet
ist Verhalten sollen?Sieht aus wie Ihre Antwort ist das richtige Verhalten: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
In der Tat ist dies ein häufiges Problem in der Javascript-und jetzt kann ich sehen, warum
let
wäre wirklich nützlich. Einstellung der Ereignis-Listener in einer Schleife nicht mehr erfordert eine immediatelly aufgerufene Funktion Ausdruck für lokal scopingi
bei jeder iteration.Der Gebrauch von "lassen" nur schiebt dieses problem. Also jede iteration erzeugt eine unabhängige block-scope, aber der "ich" - variable kann immer noch beschädigt werden, durch nachträgliche änderungen innerhalb des Blocks, (zugegeben, das iterator-variable ist nicht meistens geändert in den block, aber auch andere erklärte lass-Variablen innerhalb des Blocks kann gut sein) und jede deklarierte Funktion innerhalb des Blocks können, wenn Sie aufgerufen wird, beschädigt der Wert von "i" für weitere Funktionen deklariert, die innerhalb der block, weil Sie teilen sich die gleichen privaten Blockbereich, daher der gleiche Verweis auf "ich".
InformationsquelleAutor Gurpreet Singh
Was ist der Unterschied zwischen
let
undvar
?var
- Anweisung ist bekannt in der gesamtenlet
- Anweisung ist nur bekannt, in block in der Sie definiert ist, ab dem Zeitpunkt definiert ist, an. (**)Um den Unterschied zu verstehen, betrachten Sie folgenden code:
Hier können wir sehen, dass unsere variable
j
ist nur bekannt, in der ersten for-Schleife, aber nicht davor und danach. Doch unsere variablei
ist bekannt in der gesamten Funktion.Bedenken Sie auch, dass block-Gültigkeitsbereich von Variablen nicht bekannt sind, bevor Sie deklariert sind, weil Sie nicht gehisst. Sie sind auch nicht erlaubt zu deklarieren, die denselben block Gültigkeitsbereich variable, die in dem gleichen block. Dies macht block Gültigkeitsbereich von Variablen weniger fehleranfällig als Global oder funktional Gültigkeitsbereich von Variablen, die gehisst werden, und die produzieren keine Fehler im Fall von mehreren Erklärungen.
Ist es sicher zu bedienen
let
heute?Einige Leute würden argumentieren, dass in der Zukunft werden wir NUR verwenden, lassen Sie Aussagen, und dass var-Anweisungen überflüssig werden. JavaScript-guru Kyle Simpson schrieb ein sehr umfangreicher Artikel darüber, warum er glaubt, dass nicht der Fall sein wird.
Heute, aber das ist definitiv nicht der Fall. In der Tat, müssen wir tatsächlich die Frage stellen, ob es sicher ist zu verwenden, die
let
- Anweisung. Die Antwort auf diese Frage hängt von Ihrer Umgebung ab:Wenn Sie schreiben von server-side JavaScript-code (Node.js), Sie können sicher verwenden die
let
- Anweisung.Wenn Sie schreiben clientseitiger JavaScript-code und verwenden Sie eine browser-basierte transpiler (wie Traceur oder babel-standalone - ), Sie können sicher verwenden die
let
Aussage, aber dein code ist wahrscheinlich alles andere als optimal in Bezug auf Leistung.Wenn Sie schreiben clientseitiger JavaScript-code und verwenden Sie eine Node-basierte transpiler (wie die traceur shell-script oder Babel), Sie können sicher verwenden die
let
- Anweisung. Und weil Ihr browser wird wissen nur über die transpiled-code, performance-Nachteile, sollte begrenzt werden.Wenn Sie schreiben clientseitiger JavaScript-code und nicht mit einem transpiler, die Sie benötigen, zu prüfen, browser-Unterstützung.
Gibt es immer noch einige Browser, die nicht unterstützen
let
an alle :Wie zu verfolgen, browser-Unterstützung
Für eine aktuelle übersicht, welche Browser unterstützen die
let
- Anweisung, die zur Zeit Ihrer Lektüre dieser Antwort sehen dasKann ich
- Seite.(*) Global und funktional Gültigkeitsbereich von Variablen können initialisiert werden und verwendet werden, bevor Sie deklariert sind, da JavaScript-Variablen sind hochgezogen. Dies bedeutet, dass Erklärungen immer viel zu der Spitze des Bereichs.
(**) Block Gültigkeitsbereich von Variablen nicht gehisst
i
IST überall bekannt in der Funktion-block! Es beginnt wieundefined
(durch hochziehen), bis Sie einen Wert zuweisen! ps:let
ist auch gehisst (oben ist es mit block), aber geben einReferenceError
wenn der Verweis im block vor der ersten Zuweisung. (ps2: ich bin ein pro-Semikolon kinda Kerl, aber Sie wirklich nicht brauchen ein Semikolon nach dem block ). That being said, vielen Dank für das hinzufügen der reality-check über die Unterstützung!Nach der Mozilla Developer Network : "In ECMAScript 2015, lassen Bindungen unterliegen nicht Variable Anheben, was bedeutet, dass let-Deklarationen nicht zu bewegen, um die Spitze der aktuellen Ausführungskontext." - Wie auch immer, ich machte ein paar Verbesserungen zu meiner Antwort, die klären sollten, der Unterschied in der Hebezeug-Verhalten zwischen
let
undvar
!Deine Antwort stark verbessert (habe ich geprüft). Beachten Sie, dass gleiche link, den Sie auf die in Ihrem Kommentar auch sagt: "Die (wir) variable wird in einem "zeitlichen tote zone" von der Blockanfang, bis die Initialisierung wird bearbeitet." Das bedeutet, dass die 'id' (der text-string "reserviert" auf "etwas") bereits vorbehalten, die im jeweiligen Anwendungsbereich, sonst würde sich die root/host - /Fenster-Rahmen. Für mich persönlich, 'hochziehen' bedeutet nichts anderes als das reservieren von/Verknüpfung als "Bezeichner" zu Ihren jeweiligen Anwendungsbereich; ohne Ihre Initialisierung/Zuordnung/modifyability!
Und..+1. Dass Kyle Simpson Artikel, den Sie verlinkt ist ein ausgezeichnete Lesen, vielen Dank dafür! Es ist auch klar, was die "zeitliche dead zone" aka "TDZ". Eine interessante Sache möchte ich hinzufügen: ich habe gelesen auf MDN, dass
let
undconst
waren empfohlen, nur verwenden, wenn Sie wirklich brauchen, die zusätzliche Funktionalität, weil die Durchsetzung/überprüfung von diesen extra-Funktionen (wie schreiben-nur const) in 'mehr-Arbeit' (und weitere scope-Knoten im scope-Baum) für den (Laufenden)Motor(en) zur Durchsetzung/überprüfung/überprüfen/einrichten.Beachten Sie, dass MDN sagt, dass der IE NICHT interpretieren lassen, richtig. Welche ist es? developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
InformationsquelleAutor John Slegers
Hier ist ein Erklärung des
lassen
- Schlüsselwort mit einigen Beispielen.Diese Tabelle auf Wikipedia zeigt, welche Browser die Unterstützung von Javascript 1.7.
Beachten Sie, dass nur Mozilla und Chrome-Browsern unterstützt. IE, Safari und möglicherweise andere nicht.
Während es technisch korrekt zu sagen, dass IE nicht unterstützt, ist es richtiger zu sagen, dass es ein mozilla-nur-Erweiterung.
eigentlich Mozilla ist nur vor dem Spiel. Siehe Seite 19 ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
das ist nur die Menge der Wörter, die schon seit Jahren reserviert. Wenn mozilla Hinzugefügt, lassen Sie es war rein eine mozilla-Erweiterung, mit keine Verwandte spec. ES6 sollte definieren Verhalten lassen Aussagen, aber was danach kam mozilla eingeführt, die syntax. Denken Sie daran moz hat auch E4X, die ist komplett tot und moz nur.
IE11 Unterstützung für
let
msdn.microsoft.com/en-us/library/ie/dn342892%28v=vs.85%29.aspxInformationsquelleAutor Ben S
Die akzeptierte Antwort ist, fehlt ein Punkt:
Die akzeptierte Antwort NICHT erklären diesen Punkt in seinem Beispiel. Die akzeptierte Antwort nur bewiesen, dass Sie in einem
for
- Schleife Initialisierer, dramatisch Verengung der Anwendungsbereich der Beschränkungen vonlet
. Von Ihnen positiv bewertet werden.Es besagt ausdrücklich "lassen Sie bezieht sich auf die nächsten umschließenden block"; nicht jede Art und Weise manifestiert, einbezogen werden müssen?
es gab eine Menge Beispiele, und keiner von Ihnen richtig gezeigt, die Rolle .. ich könnte von Ihnen positiv bewertet werden sowohl die akzeptierte Antwort, und, diese?
Dieser Beitrag zeigt, dass ein "block" kann einfach eine Reihe von Linien in Klammern gesetzt werden; d.h. es muss nicht verbunden sein mit jeder Art von Ablaufsteuerung, loop, etc.
InformationsquelleAutor Lcf.vs
let
Blockbereich
Variablen deklariert, mit der
let
keyword-block-Bereich, was bedeutet, dass Sie verfügbar sind nur in der block, in dem Sie deklariert wurden.Auf der obersten Ebene (außerhalb einer Funktion)
Auf der obersten Ebene werden die Variablen deklariert, mit
let
erstellen Sie keine Eigenschaften auf das Globale Objekt.Innerhalb einer Funktion
Innerhalb einer Funktion (aber außerhalb eines Blocks),
let
hat den gleichen Umfang wievar
.Innerhalb eines Blocks
Variablen deklariert, mit
let
innerhalb eines Blocks kann nicht zugegriffen werden, die außerhalb dieses Blocks.Innerhalb einer Schleife
Deklarierten Variablen mit
let
in Schleifen auf die verwiesen werden kann nur innerhalb dieser Schleife.Schleifen mit Verschlüssen
Wenn Sie
let
stattvar
in einer Schleife bei jeder iteration erhalten Sie eine neue variable. Das bedeutet, dass Sie können sicher mit einem Verschluss in einer Schleife.Zeitliche dead zone
Weil die zeitliche dead zone, Variablen deklariert, mit
let
kann nicht zugegriffen werden, bevor Sie deklariert sind. Der Versuch zu tun, so wirft einen Fehler.Kein re-deklarieren
Kann man nicht erklären, die gleiche variable mehrfach mit
let
. Man kann auch nicht eine variable deklarieren, die mitlet
mit dem gleichen Bezeichner wie eine andere variable, die deklariert wurde mitvar
.const
const
ist ganz ähnlich wielet
—es ist block-Gültigkeitsbereich und hat TDZ. Es gibt jedoch zwei Dinge, die anders sind.Kein re-zuweisen
Variable deklariert, mit
const
können nicht neu belegt werden.Beachten Sie, dass es nicht bedeutet, dass der Wert unveränderlich ist. Seine Eigenschaften noch verändert werden kann.
Wenn Sie wollen, um ein immutable-Objekt verwenden, sollten Sie
- Objekt.freeze()
.Initialisierung erforderlich ist
Du immer einen Wert angeben muss bei der Deklaration einer Variablen, die mit
const
.InformationsquelleAutor Michał Perłakowski
Gibt es einige subtile Unterschiede --
let
scoping verhält sich so, wie variable scoping in mehr oder weniger alle anderen Sprachen.z.B. Es Bereiche, die den umschließenden block, Sie existiert nicht, bevor Sie erklärte, etc.
Aber es ist erwähnenswert, dass
let
ist nur ein Teil der neueren Javascript-Implementierungen und unterschiedliche browser-Unterstützung.let
ist eingeschlossen in die 6. Ausgabe-Entwurf und wird höchstwahrscheinlich in die endgültige Spezifikation.Das ist der Unterschied von 3 Jahren macht 😀
Nur stubled auf diese Frage und in 2012 ist es immer noch der Fall, dass nur Mozilla-Browser unterstützen
let
. Safari, IE, und Chome überhaupt nicht.Die Idee versehentlich erstellen partieller block-Bereich auf Unfall ist ein guter Punkt, Vorsicht,
let
nicht hissen, um eine variable zu verwenden, definiert durch einelet
definiert Sie oben auf dem block. Wenn Sie eineif
- Anweisung, die mehr als nur ein paar Zeilen code, können Sie vergessen, dass Sie nicht verwenden können, dass die variable erst, nachdem Sie definiert ist. GROßARTIGER PUNKT!!!ja und Nein: "In ECMAScript 2015,
let
hissen die variable, auf der Oberseite des Blocks. Jedoch verweisen auf die variable in dem block vor der Deklaration der Variablen Ergebnis in eine ReferenceError (meine Anmerkung: statt der guten altenundefined
). Die variable ist in einem "zeitlichen dead zone' aus dem Anfang des Blocks, bis die Erklärung ist bearbeitet." Dasselbe gilt für "switch-Anweisungen, da es nur einen zugrunde liegenden block". Quelle: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...InformationsquelleAutor olliej
Variable Nicht Hochziehenlet
wird nicht hissen um den gesamten Umfang der Sperre, die Sie in angezeigt werden. Dagegenvar
könnte hoist, wie unten beschrieben.Eigentlich Pro @Bergi, Sowohl
var
undlassen
sind gehisst.Garbage Collection
Block Rahmen
let
nützlich ist, bezieht sich auf Verschlüsse und die garbage collection, um Speicherplatz freizugeben. Überlegen Sie,Den
click
handler callback muss nicht diehugeData
variable überhaupt. Theoretisch, nachprocess(..)
läuft, die riesigen Daten-StrukturhugeData
könnte Müll gesammelt. Es ist jedoch möglich, dass einige JS-engine noch zu halten, diese riesige Struktur, da dieclick
Funktion hat einen Verschluss über den gesamten Umfang.Jedoch, wird der block scope kann diese riesigen Daten-Struktur an Müll gesammelt.
let
Schleifenlet
in der Schleife kann re-bindet es zu jeder iteration der Schleife, so dass Sie sicher, dass re-weisen Sie ihm den Wert aus der vorherigen Schleife iteration. Überlegen Sie,Jedoch ersetzen
var
mitlet
Weil
let
erstellen Sie eine neue lexikalische Umgebung mit, diese Namen für a) die initialiser Ausdruck b) jede iteration (vorher die für die Beurteilung der Inkrement-Ausdruck), mehr Einzelheiten sind hier.Yip, die Sie gehisst werden, aber Verhalten, als wenn Sie nicht gehisst, weil der (Trommelwirbel) Zeitliche Dead Zone - ein sehr dramatischer name für einen Bezeichner nicht zugegriffen werden, bis es erklärt:-)
So lassen gehievt wird, aber nicht verfügbar? Wie ist das anders als 'nicht gehisst'?
Hoffentlich Brian oder Bergi wieder kommen, diese zu beantworten. Ist die Erklärung des lassen gehisst, aber die Belegung nicht? Danke!
Hier ist ein post von Bergi, vielleicht findest du die Antwort.
InformationsquelleAutor zangw
Der Hauptunterschied ist die Umfang Unterschied, während lassen kann nur innerhalb der Umfang es ist erklärt, wie in der for-Schleife, var zugegriffen werden kann außerhalb der Schleife zum Beispiel. Aus der Dokumentation in MDN (Beispiele auch aus MDN):
Vergessen Sie auch nicht, es ist ECMA6 Funktion, es ist also noch nicht vollständig unterstützt, so ist es besser, immer transpiles es zu ECMA5 mit Babel etc... für mehr Infos besuchen Sie babel-website
InformationsquelleAutor Alireza
Hier ist ein Beispiel, um add-on zu dem, was andere bereits geschrieben haben. Angenommen, Sie wollen eine Reihe von Funktionen, die
adderFunctions
, wo jede Funktion nimmt ein einzelnes argument Zahl und gibt die Summe der Argumente und die Funktion index in das array. Zu erzeugen versuchenadderFunctions
mit einer Schleife über dievar
keyword nicht so funktionieren, wie jemand vielleicht naiv erwarten:Den obigen Vorgang nicht erzeugen die gewünschte array-Funktionen, da
i
's Geltungsbereich erstreckt sich über die iteration derfor
block, in dem jede Funktion erstellt wurde. Stattdessen wird am Ende der Schleife, diei
in jeder Funktion die Schließung bezieht sich aufi
's-Wert am Ende der Schleife (1000) für jeden anonymen Funktion inadderFunctions
. Dies ist nicht das, was wir wollten: wir haben jetzt ein array mit 1000 verschiedenen Funktionen im Speicher mit genau dem gleichen Verhalten. Und wenn wir anschließend aktualisieren Sie den Wert voni
die mutation wirkt sich auf alleadderFunctions
.Aber wir können versuchen, wieder mit der
let
Stichwort:Dieser Zeit
i
ist der Rückstoß bei jeder iteration derfor
Schleife. Jede Funktion, die jetzt hält den Wert voni
an der Zeit, von der Funktion der Schöpfung, undadderFunctions
verhält sich wie erwartet.Jetzt Bild mischen der zwei Verhaltensweisen, und Sie werden wahrscheinlich sehen, warum es nicht empfehlenswert ist die Mischung der neueren
let
undconst
mit den älterenvar
im selben Skript. Hierdurch kann sich die ist einige der spektakulär verwirrenden code.Lassen Sie dieses nicht Ihnen geschehen. Verwenden Sie eine linter.
Korrektur: Technisch, Pfeil-Funktion die hier beschriebene syntax => developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Tatsächlich, Sie brauchen nicht
let value = i;
. Diefor
- Anweisung erstellt eine lexikalische block.InformationsquelleAutor abroz
Ist der Unterschied in der Umfang der deklarierten Variablen mit jedem.
In der Praxis gibt es eine Reihe von nützlichen Konsequenzen der Differenz Umfang:
let
Variablen sind nur sichtbar in Ihrer nächsten umschließenden block ({ ... }
).let
Variablen sind nur nutzbar, die in den Zeilen von code, der auftreten nach die variable deklariert ist (obwohl Sie sind gehisst!).let
Variablen kann nicht erneut deklariert werden durch eine anschließendevar
oderlet
.let
Variablen nicht im globalenwindow
Objekt.let
Variablen sind einfach zu bedienen mit Verschlüssen (Sie verursachen keine race conditions).Den Einschränkungen, die durch
let
reduzieren die Sichtbarkeit der Variablen und die Wahrscheinlichkeit erhöhen, dass unerwartete Kollisionen mit Namen, die gefunden werden früh. Dies macht es leichter zu verfolgen und den Grund zu Variablen, einschließlich Ihrer Erreichbarkeit(hilft mit der Rückforderung von nicht verwendetem Speicher).Folglich
let
Variablen sind weniger wahrscheinlich zu Problemen führen, wenn in großen Programmen oder, wenn unabhängig voneinander entwickelten frameworks kombiniert, in neue und unerwartete Art und Weise.var
kann dennoch nützlich sein, wenn Sie sicher sind, dass Sie wollen, dass der einzige verbindliche Wirkung, wenn Sie mit einem Verschluss in einer Schleife (#5) oder für die Deklaration extern-sichtbaren globalen Variablen in Ihrem code (#4). Verwendung vonvar
für Exporte ersetzt werden, wennexport
wandert aus transpiler Raum und die core-Sprache.Beispiele
1. Keine Verwendung außerhalb der nächsten umschließenden block:
Dieser code-block wird werfen Sie einen Referenz-Fehler, da die zweite Verwendung des
x
tritt außerhalb des Blocks, wo es erklärt wird mitlet
:Im Gegensatz dazu das gleiche Beispiel mit
var
funktioniert.2. Keine Nutzung vor Erklärung:
Dieser code-block werfen wird
ReferenceError
bevor der code ausgeführt werden kann, weilx
verwendet wird, bevor es deklariert ist:Im Gegensatz dazu das gleiche Beispiel mit
var
analysiert und läuft, ohne dass irgendwelche Ausnahmen.3. Kein nochmaliges deklarieren einer:
Der folgende code veranschaulicht, dass eine variable deklariert mit
let
kann nicht erneut deklariert später:4. Globals nicht an
window
:5. Einfache Nutzung mit Verschlüsse:
Deklarierte Variablen mit
var
funktionieren nicht gut mit closures in Schleifen. Hier ist eine einfache Schleife, die Ausgänge, die Reihenfolge der Werte, die die variablei
hat an verschiedenen Punkten in der Zeit:Konkret Ausgänge:
In JavaScript verwenden wir Häufig Variablen zu einem erheblich späteren Zeitpunkt, als wenn Sie erstellt werden. Wenn wir demonstrieren dies durch die Verzögerung der Ausgabe mit einer closure übergeben
setTimeout
:... der Ausgang bleibt unverändert, solange bleiben wir bei
let
. Im Gegensatz dazu, wenn wirvar i
statt:... die Schleife unerwartet Ausgänge "i ist 5" fünf mal:
var
stattlet
, der code ist äquivalent zu:var i = 0; while (i < 5) { doSomethingLater(); i++; }
i
außerhalb der Verschluss, und durch die Zeit, diedoSomethingLater()
ausgeführt wird, wirdi
wurde bereits erhöht, 5-mal, daher ist der Ausgangi is 5
fünf mal. Durch die Verwendunglet
die variablei
ist in den Verschluss, so dass jeder asynchrone Aufruf bekommt seine eigene Kopie deri
statt die 'global' eine, die erstellt wird, mitvar
.Ich glaube nicht, dass die transformation der Aufhebung des Variablen-definition aus der Schleife Initialisierer erklärt alles. Das ist einfach die normale definition der Semantik von
for
. Eine genauere transformation, obwohl komplizierter, ist die klassischefor (var i = 0; i < 5; i++) { (function(j) { setTimeout(_ => console.log(
i ist ${j}), 125/*ms*/); })(i); }
die führt ein "- Funktion-Aktivierung der Aufzeichnung", zu speichern jeden Wert voni
mit dem Namenj
innerhalb der Funktion.InformationsquelleAutor mormegil
Können die folgenden zwei Funktionen die den Unterschied zu zeigen:
InformationsquelleAutor Abdennour TOUMI
let
ist interessant, denn es ermöglicht uns, so etwas zu tun:Welche Ergebnisse bei der Zählung [0, 7].
In der Erwägung, dass
Zählt nur [0, 1].
Zweck? es ist ein Konstrukt, Sie können es verwenden Sie jedoch bitte, einer der interessantesten Wege ist, wie dieses.
InformationsquelleAutor Dmitry
Funktion VS block-scope:
Den wichtigsten Unterschied zwischen
var
undlet
ist, dass Variablen, die mitvar
sind Funktion Gültigkeitsbereich. In der Erwägung, dass die Funktionen deklariert, mitlet
sind block Gültigkeitsbereich. Zum Beispiel:Variablen mit
var
:Wenn die erste Funktion
testVar
aufgerufen wird, die variable foo deklariert, mitvar
ist noch von außen zugänglichif
- Anweisung. Diese variablefoo
zur Verfügung stehen würde überall im Rahmen dertestVar
Funktion.Variablen mit
let
:Wenn die zweite Funktion
testLet
aufgerufen wird, wird die variable bar, deklariert mitlet
ist nur innen zugänglichif
- Anweisung. Da die deklarierten Variablen mitlet
sind block Gültigkeitsbereich (wo ein block ist der code zwischen den geschweiften Klammern.e.gif{}
,for{}
,function{}
).let
Variablen nicht bekommen gehisst:Weiterer Unterschied zwischen
var
undlet
ist Variablen deklariert, mitlet
nicht bekommen gehisst. Ein Beispiel ist der beste Weg, um dieses Verhalten zu veranschaulichen:Variablen mit
let
nicht bekommen gehisst:Variablen mit
var
tun bekommen gehisst:Globalen
let
nicht befestigt bekommenwindow
:Eine variable deklariert mit
let
im globalen Bereich (also code, der nicht in einer Funktion) nicht Hinzugefügt als eine Eigenschaft der globalenwindow
Objekt. Zum Beispiel (dieser code steht im globalen scope):Verwenden
let
übervar
Wann immer Sie können, weil es einfach scoped mehr spezifischen. Dies reduziert mögliche Namenskonflikte, die auftreten können, wenn der Umgang mit einer großen Anzahl von Variablen.var
verwendet werden können, wenn Sie möchten, eine Globale variable, die nicht ausdrücklich auf diewindow
Objekt (immer sorgfältig prüfen, ob dies wirklich notwendig ist).InformationsquelleAutor Willem van der Veen
Es scheint auch, dass, zumindest in Visual Studio 2015, Typoskript 1.5, "var" können mehrere Deklarationen mit dem gleichen Variablennamen in einem block, und "lassen" nicht.
Diese nicht generiert einen Kompilierungsfehler:
Wird dies:
InformationsquelleAutor RDoc
Bei Der Verwendung
let
Den
let
Schlüsselwort legt die Deklaration von Variablen der Geltungsbereich von was auch immer-block (in der Regel{ .. }
- pair-Mädchen) es ist auch enthalten in. In anderen Worten,let
implizit entführt jedem block Gültigkeitsbereich für die Variablen-Deklaration.let
Variablen kann nicht zugegriffen werden, in derwindow
Objekt, weil Sie nicht Global zugegriffen.Bei Der Verwendung
var
var
und Variablen in ES5 hat-Bereichen in Funktionen Bedeutung der Variablen sind gültig innerhalb der Funktion und nicht außerhalb der Funktion selbst.var
- Variablen zugegriffen werden, die in derwindow
Objekt, weil Sie nicht Global zugegriffen.Wenn Sie mehr wissen wollen, Lesen Sie weiter unten
einer der bekanntesten interview-Fragen in Bezug auf den Anwendungsbereich kann auch ausreichen, die genaue Verwendung der
let
undvar
als unten;Bei der Verwendung
let
Denn bei Verwendung
let
für jeden loop-Durchlauf die variable den Gültigkeitsbereich und hat seine eigene Kopie.Bei der Verwendung
var
Denn bei Verwendung
var
für jeden loop-Durchlauf die variable den Gültigkeitsbereich und hat gemeinsam kopieren.InformationsquelleAutor Ankur Soni
Wenn ich Lesen Sie die Spezifikationen, dann rechts
let
zum Glück kann auch genutzt werden, um zu vermeiden, selbst das aufrufen von Funktionen verwendet, um zu simulieren, private, nur für Mitglieder eine beliebte design-Muster, das verringert die Lesbarkeit des Codes, erschwert das debugging, fügt hinzu, dass keine wirkliche code-Schutz oder andere Vorteile - außer vielleicht die Befriedigung jemandes Wunsch für die Semantik, also Hör auf es zu benutzen. /rantSiehe 'Die Emulation private Schnittstellen'
InformationsquelleAutor Daniel Sokolowski
Einige hacks mit
let
:1.
2.
3.
Getter-und setter-mit
let
:let { type, name, value } = node;
? Sie erstellen ein neues Objekt mit 3 Eigenschaften Typ/Namen/Wert ein und initialisieren Sie Sie mit den Eigenschaften Werte von Knoten ?In Beispiel 3 sind Sie re-deklarieren-Knoten, die Ursache Ausnahme. Alle diese Beispiele funktionieren auch perfekt mit
var
zu.InformationsquelleAutor zloctb
lassen, ist ein Teil des es6. Diese Funktionen erklären den Unterschied in der einfachen Weise.
InformationsquelleAutor vipul jain
Bisher gab es nur zwei Gültigkeitsbereiche in JavaScript, d.h. die funktionalen und global. Mit '
let
" keyword JavaScript hat jetzt eingeführtblock-level
Variablen.Haben ein komplettes Verständnis von der 'let' Schlüsselwort
ES6: "let' Schlüsselwort zum deklarieren von Variablen in JavaScript helfen.
InformationsquelleAutor Hitesh Garg
Nun ich denke, es ist besser scoping von Variablen zu einem block von Anweisungen, mit
let
:Ich denke, dass die Menschen anfangen mit let ' hier nach, so dass Sie haben ähnliche scoping-Regeln in JavaScript wie in anderen Sprachen, Java, C#, etc.
Menschen mit nicht ein klares Verständnis über die scoping-Regeln in JavaScript verwendet, um den Fehler früher.
Hochziehen wird nicht unterstützt mit
let
.Mit diesem Ansatz zu Fehlern in JavaScript werden immer entfernt.
Finden ES6 In die Tiefe: let und const um es besser zu verstehen.
InformationsquelleAutor swaraj patil
Dieser Artikel legt eindeutig fest, der Unterschied zwischen var, let und const
https://medium.com/javascript-scene/javascript-es6-var-let-or-const-ba58b8dcde75#.esmkpbg9b
InformationsquelleAutor anandharshan
Wie oben erwähnt:
Beispiel1:
In meinen beiden Beispielen habe ich eine Funktion
myfunc
.myfunc
enthält eine variable, diemyvar
gleich 10.In meinem ersten Beispiel habe ich überprüfen, ob
myvar
gleich 10 (myvar==10
) . Wenn ja, ich agian deklarieren Sie eine variablemyvar
(jetzt habe ich zwei Variablen myvar)mitvar
Schlüsselwort und weisen Sie Ihr einen neuen Wert (20). In der nächsten Zeile, die ich drucken, dessen Wert auf meine Konsole. Nach der bedingte block ich wieder drucken Sie den Wertmyvar
auf meiner Konsole. Wenn Sie einen Blick auf die Ausgabe vonmyfunc
,myvar
hat den Wert 20.Beispiel2:
In meinem zweiten Beispiel, statt der Verwendung
var
Schlüsselwort in meiner bedingten block erkläre ichmyvar
mitlet
Schlüsselwort . Wenn ich jetzt callmyfunc
ich zwei verschiedene Ausgänge:myvar=20
undmyvar=10
.Also der Unterschied ist ganz einfach ich.e Ihren Anwendungsbereich.
InformationsquelleAutor N Randhawa
Werfen Sie einen Blick auf dieses Bild, habe ich ein sehr einfaches Beispiel für die demonstration der
const
undlet
Variablen. Wie Sie sehen können, wenn Sie versuchen, sich zu ändernconst
variable, erhalten Sie die Fehlermeldung (Versuchen zu überschreiben 'name' die Konstante'), aber werfen Sie einen Blick auflet
variable...Zuerst erklären wir
let age = 33
, und später weisen Sie einen anderen Wertage = 34;
, das ist ok, wir haben keinen Fehler wenn wir versuchen zu ändernlet
variableInformationsquelleAutor Mile Mijatovic
So, ich bin derzeit versucht, ein tiefgehendes Verständnis von JavaScript, ich werde meine kurzen recherche, die enthält einige der Stücke, die bereits besprochen, sowie einige andere details in einer anderen Perspektive.
Verständnis der Unterschied zwischen var und lassen kann einfacher sein, wenn wir verstehen, was der Unterschied zwischen Funktion und Blockbereich.
Wir betrachten die folgenden Fälle:
wenn
timer()
aufgerufen wird, wird eine ExecutionContext erstellt wird, die enthält sowohl die VariableEnvironment und alle LexicalEnvironments, die der jeweiligen iteration.Und ein einfacheres Beispiel
Funktionsumfang
Blockbereich
InformationsquelleAutor Lucian Nut
lassen vs var. Es ist alles über Umfang.
var Variablen sind global und zugegriffen werden kann, im Grunde überall, während lassen-Variablen werden nicht global und existieren so lange, bis eine schließende Klammer tötet Sie.
Siehe mein Beispiel unten, und beachten Sie, wie der Löwe (lassen) variable verhält sich das anders in den zwei Konsolen.protokolliert werden; es wird von scope in die 2. Konsole.log.
InformationsquelleAutor daCoda
ECMAScript 6 dazu noch eine keyword-Variablen deklarieren, andere das "const", die nicht "lassen".
Das primäre Ziel der Einführung von "lassen" und "const" über "var" ist block-scoping-anstelle des traditionellen lexikalische scoping.
Dieser Artikel erklärt ganz kurz den Unterschied zwischen "var" und "lassen" und es umfasst auch die Diskussion über "const".
InformationsquelleAutor Gurucharan M K