Babels Leitfaden zu ES6 sagt:
let
ist das neuevar
.
Anscheinend besteht der einzige Unterschied darin, dass var
der Gültigkeitsbereich der aktuellen Funktion und let
der Gültigkeitsbereich des aktuellen Blocks festgelegt wird . Diese Antwort enthält einige gute Beispiele .
Ich kann keinen Grund für die Verwendung var
in ES6-Code erkennen. Selbst wenn Sie eine gegebene Variable auf die gesamte Funktion beschränken möchten, können Sie dies tun, let
indem Sie die Deklaration am oberen Rand des Funktionsblocks platzieren. Dies ist das, was Sie tun sollten var
, um den tatsächlichen Umfang anzugeben. Und wenn Sie etwas feiner in einem for
Block oder so etwas sehen wollen, dann können Sie das auch tun.
Mein Instinkt ist also, var
beim Schreiben von ES6-Code die Verwendung ganz einzustellen.
Meine Frage ist, irre ich mich dabei? Gibt es einen legitimen Fall, in dem var
es vorzuziehen wäre let
?
quelle
var
dieser Variablen als bewusster Indikator für die gesamte Funktion eine nützliche "selbstdokumentierende" Konvention sein könnte .let
Anweisung ganz oben auf eine Funktion setzen, ist es meines Erachtens genauso offensichtlich, dass Sie beabsichtigten, sie auf die gesamte Funktion zu übertragen. Ich glaube nicht, dass die Verwendungvar
es klarer macht, als es einfach oben anzuordnen.var
noch besteht, die Abwärtskompatibilität ist. Wäre das nicht so gewesen, hätten sie alles weggenommenvar
oder gar nicht erst eingeführtlet
und stattdessen die Semantikvar
dahingehend geändert, wie es wohl die ganze Zeit hätte sein sollen.var
scheinen mir gering und reichen nicht aus, um eine dritte Art von Variable zu rechtfertigen, die herumspringt. Sie können einelet
Funktion einfach auf eine ganze Funktion ausdehnen, indem Sie sie oben auf die Funktion setzen. Dies ist in der Absicht viel deutlicher als das Schreibenvar
in einen Block (damit sie aus diesem Block herausgezogen wird und Sie sie dann außerhalb des Blocks verwenden können) - seltsam). Er warnt davor, dass, wenn Sie einelet
auf eine Funktion setzen, "es nur die Position ist, die den Unterschied signalisiert, und nicht die Syntax", aber ich denke, das ist eine gute Sache.var
. Die Beispiele, die er zur Aufbewahrung vorstellt,var
scheinen erfunden zu sein - und beruhen auf schwerwiegenden Codierungsfehlern. Es ist viel besser, auf einen Fehler zu stoßen und gezwungen zu sein, solche Fehler zu beheben, als Sprachfunktionen zu verwenden, mit denen man davonkommt! Was kommt als nächstes, raten Sie, alles in einen Versuch / Fang zu wickeln, um Abstürze zu vermeiden? Der Rest dieses Links ist gut, aber ich stimme diesem speziellen Teil überhaupt nicht zu.Antworten:
Doug Crockford diskutiert
let
an dieser Stelle in seinem Vortrag " The Better Parts ".Der Punkt ist,
let
vermeidet eine Quelle von Missverständnissen, insb. für Programmierer mit Erwartungen an Sprachen mit Blockumfang. Avar
hat einen Funktionsumfang (es deklariert eine Variable, die in der gesamten Funktion sichtbar ist), obwohl es aussieht, als hätte es einen Blockumfang .var
Vielleicht ist es im Extremfall, wie bei maschinengeneriertem Code, immer noch nützlich, aber ich bin sehr gespannt.(
const
ist ebenfalls neu und hat einen Blockbereich. Nachdemlet x = {'hi': 'SE'}
Sie neu zuweisen könnenx
, während nachdemconst y = x
Sie nicht neuy
zuweisen können . Dies ist häufig vorzuziehen, da es verhindert, dass sich versehentlich etwas unter Ihnen ändert. Um klar zu sein, können Sie das Objekt jedoch ändern, esy.hi = 'SO'
sei denn, Sie einfrieren.)Realistisch gesehen stimmt Ihr Eindruck für ES6: Übernehmen
let
undconst
. Hör auf zu benutzenvar
.(In einer anderen Aufführung von „The Better Parts“ , sagt Doug warum
===
hinzugefügt wurde , anstatt zur Festsetzung der Probleme des==
.==
Produziert einige „ überraschend“ Ergebnisse, also nur annehmen===
.)Ein aufschlussreiches Beispiel
Mozilla Developer Network gibt ein Beispiel, in dem
var
nicht wie vorgesehen gearbeitet wird. Ihr Beispiel ist realistisch und setztonclick
Handler auf einer Webseite. Hier ist ein kleinerer Testfall:var
schlägt fehl, weil alle Schleifeniterationen dieselbe funktionsbezogenei
Variable verwenden, die5
nach Beendigung der Schleife den Wert hat .quelle
==
ist überhaupt nicht kaputt. Es kann einfach definiert werden alsequality comparison using coersion
Check out github.com/getify/You-Dont-Know-JS/blob/master/…[ '1.0' == 1.0, [1.0] == 1.0, [1.0] == '1.0', ['1.0'] == 1.0, [null] == '', [null] == 'null', '00' == false, [] == [], [] == 0, [] == '', [] == false, [] == true, [010] - [4] == ' 4.0 ', !![0], !![1], [0] == true, [1] == true, 1 == [[1]], 0 == [[0]], '1' == [1] ]
let
undvar
sondern zwischenlet
,var
undconst
var
funktioniert wie geplant, aber nicht wie viele Leute erwarten. Es ist ein Usability-Fehler, kein Implementierungsfehler.Wenn Sie korrekten Code geschrieben haben, können Sie wahrscheinlich alle Anweisungen ohne semantische Änderungen
var
inlet
Anweisungen umwandeln .let
ist vorzuziehen, weil dadurch der Bereich verringert wird, in dem ein Bezeichner sichtbar ist. Es ermöglicht uns, Variablen am Ort der ersten Verwendung sicher zu deklarieren.const
ist vorzuziehenlet
. Verwenden Sie eineconst
Deklaration, es sei denn, Sie müssen eine Referenz mutieren . Dies hat alle Vorteile,let
zusammen mit dem Reduzieren des Vorhandenseins von unitialisierten Variablen und dem Vereinfachen des Denkens über Code. Wenn Sie nicht sicher sind, ob Sie eine Referenz mutieren müssen, deklarieren Sie sie,const
bis Sie dies ausdrücklich tun müssen.quelle
Ich denke nicht unbedingt, dass Sie sich irren, aber es gibt Vorbehalte, var zu verwenden. Im Wesentlichen
let
sollte es Entwicklern helfen, die Dummheit von JavaScript zu umgehen, insbesondere bei Namenskonflikten.var
Es scheint, dass es einen größeren Bereich hat, da es in den Funktionsbereich "Closes" wechseln möchte. Es wird Zeiten geben, in denen Sie var benötigen, z. B. wenn eine temporäre Variable im Bereich eines Blocks innerhalb einer Funktion verfügbar sein muss. Andernfallslet
hilft das Bevorzugen von var Entwicklern bei Namenskonflikten. Was das Ganze angeht, ist es an der Zeit, ES6 einzuführenlet
.quelle
var
in einem Block ist innerhalb der gesamten Funktion verfügbar und nicht blockspezifisch. Es ist eine irreführende Funktion.Ich stimme eher zu, dass in es6 nur "let" verwendet werden sollte. AFIK, wenn Sie ein "let" neu deklarieren, erzeugt einen Fehler (was gut ist), während Sie mit "var" einfach den Wert überschreiben (obwohl "strict mode" in es5 auch dafür sorgt).
quelle
let
bedeutet "Variable gleich lassen". Es ist eine Deklaration, mit anderen Worten, eine Initialisierung und Zuweisung.Es existiert im Gegensatz dazu,
const
was natürlich "konstant" bedeutet - was das Gegenteil von variabel ist.Einige andere Sprachen verwenden beim Deklarieren ein Präfix für das eigentliche Objekt anstelle des Objekts (z. B.
def
eine Abkürzung für "Funktion definieren" - es fehlt vollständig der Punkt, an dem "def" steht).Let
fügt diese semantische Inkonsistenz Javascript hinzu.Logischerweise könnte eine Konstante auch gleich etwas sein, da das Schlüsselwort "let" die Zuweisung von Speicher dient.
Das Problem tritt auf, weil das
var
Schlüsselwort, das zuvor eingeführtconst
wurde, unterstützt wurde, sodass die Abwärtskompatibilität vorschreibt, dassvar
keine Variable erforderlich ist. (Es kann auch verwendet werden, um einen konstanten Wert zuzuweisen.)Daher die Einführung
let
in die falsche Position. Um sicherzustellen, dass wir uns daran erinnern, dass dies lexikalisch falsch ist, haben sie auch beschlossen, den lexikalischen Umfang vonlet
vs zu ändernvar
, sodass die Inkonsistenz beim Debuggen für uns an erster Stelle steht.Mit anderen Worten, es
let
existiert, weil die Leute (dh die Sprachbetreuer) der Meinung sind, dass Javascript zu konsistent ist, da sie alle seine Redewendungen und Eigenheiten beherrschen und mehr verlangen.Randnotiz: Funktioniert
var
nicht in "Pfeil" -Blöcken, wenn Sie die Blöcke als Abschlüsse behandeln möchten (da diesvar
vor der Behandlung von Blöcken als Abschlüsse eingeführt wurde), aberlet
.quelle
let
da sie im Widerspruch zum Ton anderer Keywords in der gleichen Kategorie in JavaScript steht. Dies beantwortet jedoch nicht die Frage und ist nicht besonders gut formuliert. Abgestimmtlet
ist nicht nur Entwickler, die mehr Komplexität wünschen. Dies ist intuitiv verständlicher, da beim Schleifen und Schließen von Variablen die Schließung den letzten Wert der Variablen beibehält. Wenn Sie dies jedoch über Lets tun, hat jede Schließung in der Schleife ihren eigenen Wert für let, a la das Beispiel von @ Jerry101 oben