Lass uns den neuen Var



Wenn wir eine Programmiersprache lernen, erscheinen mehrere grundlegende Konzepte, wie das Deklarieren von Variablen, und sie sind so einfach, dass wir sie ohne Kenntnis ihrer Funktionsweise verwenden können.

Ich weiß, was Sie gedacht haben: "Warum verschwenden Sie Zeit damit, uns darüber zu schreiben?"

Ich denke, es lohnt sich, ein paar Minuten zu verbringen, um diese Elemente besser zu verstehen, was ihre Bedeutung ist und wie wir sie verwenden sollten. Dies hilft Ihnen, einige häufige Fehler zu vermeiden und Code besser zu schreiben.

In diesem Artikel konzentrieren wir uns auf das Speichern von Daten in JavaScript.

Var


"Es war einmal in einer fernen Galaxie ..." Die einzige Option zum Definieren von Variablen in JavaScript war die Verwendung des Schlüsselworts var. Dies reichte aus, um die Daten im Code zu manipulieren. Mit der Einführung des ES6-Standards wurden jedoch einige der Kuriositäten und Schwächen des alten JS ziemlich offensichtlich:

  1. Bereich: Mit dem Schlüsselwort var können Sie Variablen nur im globalen und lokalen Bereich (oder im Bereich einer Funktion) definieren. Unabhängig davon, wie viele verschachtelte Codeblöcke Sie haben, gibt es nur diese beiden Möglichkeiten.
  2. Konstanten: Wenn Sie etwas definieren möchten, das sich während der Codeausführung nicht ändert, können Sie sich nur auf den gesunden Menschenverstand der Entwickler verlassen. Wir können einige nützliche Konventionen verwenden, um die Bedeutung zu verdeutlichen (z. B. Großbuchstaben), aber es gibt nichts, was garantieren könnte, dass sich die Bedeutung nicht ändert.
  3. Überschreiben von Variablen: Sie können die Deklaration derselben Variablen beliebig oft wiederholen (im selben Bereich). Dies ist etwas verwirrend, wenn Sie die Variablen eindeutig halten möchten.

Definitionen


Bevor wir mit den technischen Dingen beginnen, wollen wir einige allgemeine Definitionen einführen:

Eine Variable ist ein „Container“, in dem wiederverwendbare Daten gespeichert werden (sehr trivial).

Bezeichner sind Variablennamen (auch sehr trivial).

Ein Block ist ein Code, der durch geschweifte Klammern ( ccskrf ) getrennt ist. Beispiel: if, for, function und. usw.

Bereich bestimmt die Sichtbarkeit von Variablen innerhalb des Codes. Wenn Sie irgendwelche Zweifel haben, fragen Sie sich: "Wo ist meine Variable im Code sichtbar?"
HINWEIS Bitte verwechseln Sie den Bereich nicht mit dem Ausführungskontext , der anders ist.

** Kontext (oder Ausführungskontext) ** ist die Umgebung, in der JavaScript-Code ausgeführt wird. Der Einfachheit halber können wir sagen, dass der Kontext das Objekt ist, zu dem der Code gehört, und dies ist das Schlüsselwort, das darauf verweist. Fragen Sie sich also: "Auf welches Objekt bezieht sich das?"

Nehmen wir nun an, unser Entwickler hat eine große Leidenschaft für Star Wars (das ist gut), ist aber misstrauisch gegenüber neuen Standards wie ES6 (was schlecht ist), obwohl es das schon seit einiger Zeit gibt. Deshalb schreibt er seinen Code lieber im alten ES5-Stil, und es wird so aussehen:

console.log("I am a %s", jedi); var jedi = "Ani"; //   jedi    // =>  undefined function useTheForce(comeToTheDarkSide) { var jedi = "Obi-Wan Kenobi"; var jedi = "Anakin Skywalker"; if (comeToTheDarkSide) { var jedi = "Darth Vader"; console.log("I am %s", jedi); // => I am Darth Vader } console.log("I am %s", jedi); //  Darth Vader } useTheForce(true); console.log("I am %s", jedi); // => Ani 

Wie Sie sehen können, gibt es drei Codeblöcke (einschließlich globaler), aber nur zwei Bereiche. Dies liegt daran, dass der Code in if-Klammern keinen Bereich erstellt. Die Konsole gibt zweimal "Ich bin Darth Vader" und dann weltweit "Ich bin Ani" aus.

Beachten Sie auch, dass dieselbe Variable innerhalb der Funktion zweimal hintereinander und dann erneut in der if-Anweisung deklariert wird. Dies bedeutet, dass wir die Deklaration derselben Variablen dreimal im selben Bereich haben, was eine Ausnahme auslöst.

Last but not least lautet die Ausgabe des ersten Protokolls: Wir drucken den Wert unserer Variablen, bevor wir ihn definieren. Dies ist bei var völlig legal und wird als "Heben" bezeichnet.

Der "Aufstieg" setzt voraus, dass die deklarierten Variablen und Funktionen physisch an den Anfang Ihres Codes verschoben werden. Technisch gesehen gibt es Deklarationen von Variablen und Funktionen, die bei der Kompilierung im Speicher gespeichert werden, aber genau dort im Code verbleiben, wo Sie sie geschrieben haben. Die grundlegende Bedeutung eines Aufzugs besteht darin, dass Sie Funktionen verwenden können, bevor Sie sie in Ihrem Code deklarieren.

Sie können hier darüber lesen.

In unserem Beispiel wird die Deklaration der Variablen "jedi" im Speicher abgelegt und auf den Standardwert (undefiniert) initialisiert.

Lass


Im Moment versteht unser Entwickler, dass ES6 nicht so schlecht ist, und er beschließt, eine Chance zu geben:

 console.log("I am a %s", jedi); let jedi = "Ani"; //   jedi    // => Uncaught ReferenceError:     "jedi"   function useTheForce(comeToTheDarkSide) { let jedi = "Obi-Wan Kenobi"; let jedi = "Anakin Skywalker"; // => Uncaught SyntaxError:  ''   if (comeToTheDarkSide) { var jedi = "Darth Vader"; console.log("I am %s", jedi); // =>  Darth Vader } console.log("I am %s", jedi); //  Anakim Skywalker } useTheForce(true); console.log("I am %s", jedi); // =>  Ani 

Er merkt jedoch schnell, dass er das var-Schlüsselwort nicht einfach ändern kann, um es zuzulassen. Dazu müssen Sie einige Korrekturen vornehmen:

Rising funktioniert nicht auf die gleiche Weise: Eine Variable wird in den Status Temporal Dead Zone * * versetzt und erst initialisiert, wenn die Definition ausgewertet wird. In unserem Beispiel wird ein Fehler ausgegeben: Referenzfehler.

Eine Neuzuweisung ist verboten. Die Definition einer Variablen im Gültigkeitsbereich muss eindeutig sein. Beim Versuch, einen Fehler zu erhalten: SyntaxError.

Die if-Anweisung ist ein gültiger Blockbereich, daher ist die darin enthaltene jedi-Deklaration eindeutig.

Jetzt sollte der Code folgendermaßen aussehen:

 let jedi = "Ani"; console.log("I am a %s", jedi); // print jedi variable before defining it // =>  Ani (  ) : 0 function useTheForce(comeToTheDarkSide) { let jedi = "Obi-Wan Kenobi"; let jedi = "Anakin Skywalker"; if (comeToTheDarkSide) { var jedi = "Darth Vader"; console.log("I am %s", jedi); // =>  Darth Vader } console.log("I am %s", jedi); //  Anakim Skywalker } useTheForce(true); console.log("I am %s", jedi); 

Const


Jetzt, da Sie alles über let wissen, wird es einfach sein, Ihnen const vorzustellen. Im Wesentlichen können wir sagen, dass const ähnlich wie let ist, aber Sie können keinen anderen Wert neu zuweisen. Sie müssen auch wissen, dass die Zuweisung nur während const-Deklarationen zulässig ist.

 function useTheForce(comeToTheDarkSide) { const jedi = "Yoda"; if (true) { jedi = "Darth Yoda"; console.log("I am %s", jedi); // => TypeError: Assignement to constant variable. } } useTheForce(true); 

Angenommen, in unserem Beispiel ist "jedi" eine Konstante mit dem Wert "Yoda". Wenn wir versuchen, den Wert in der if-Anweisung zu ändern, erhalten wir einen TypeError-Fehler. Dies ist verständlich, da Yoda niemals der dunklen Seite beitritt.

Fazit


Wenn es unmöglich ist, ein Konzept in Worten in Sprachen auszudrücken, wird ein neues Konzept eingeführt, um die Lücke zu schließen. Dies gilt für Englisch ( Link. ), Italienisch, Esperanto, Ewokese (nehme ich an) usw. Dies gilt umso mehr für Programmiersprachen wie JavaScript.

Jetzt wissen Sie, dass Sie:

  • Deklarieren Sie Variablen im Bereich des Blocks und weisen Sie ihnen nur bei der Auswertung des Blocks Speicher zu
  • Halten Sie Variablendeklarationen innerhalb des Bereichs eindeutig, und vermeiden Sie, dass der Entwickler versehentlich die in einem anderen Teil des Codes verwendete Variable überschreibt (mit einem anderen Wert).
  • Wir können sicherstellen, dass sich die in const gespeicherte Variable zu keinem Zeitpunkt ändert.

Mein letzter Tipp ist, const als Standardauswahl zu verwenden. Wenn Sie eine Variable neu zuweisen müssen, verwenden Sie ** let ** (wie in Schleifen). Und benutze var, wenn ... nein, du brauchst var wirklich nicht mehr

Vielen Dank für Ihre Aufmerksamkeit.

Schnelle Javascript-Fragen

Ich bin auf Twitter und vk

Source: https://habr.com/ru/post/de466559/


All Articles