Ich kann nicht verstehen, warum Variablen so seltsam wirken, wenn sie in einer Funktion deklariert werden.
In der
first
Funktion deklariere ich mitlet
den Variablenb
undc
mit dem Wert 10 :b = c = 10;
In der
second
Funktion zeige ich:b + ", " + c
Und das zeigt:
10, 10
Auch in
first
Funktion deklariere icha
mit Wert 10 :let a = b = c = 10;
Aber in der
second
Funktion zeigt es einen Fehler:Variable kann nicht gefunden werden:
a
Jetzt
first
deklariere ich in der Funktiond
mit Wert 20 :var d = 20;
Aber in der
second
Funktion zeigt es den gleichen Fehler wie zuvor, aber mit der Variablend
:Variable kann nicht gefunden werden:
d
Beispiel:
function first() {
let a = b = c = 10;
var d = 20;
second();
}
function second() {
console.log(b + ", " + c); //shows "10, 10"
try{ console.log(a); } // Rreference error
catch(e){ console.error(e.message) }
try{ console.log(d); } // Reference error
catch(e){ console.error(e.message) }
}
first()
javascript
variable-declaration
meckern interteiment
quelle
quelle
b
undc
nicht mit dem Präfixvar
Stichwort.a
undd
sind lokal zufirst
.Dim Apple, Banana, Pear As Fruit
bedeutetDim Apple / Dim Banana / Dim Pear As Fruit
und nichtDim Apple As Fruit / ...
.Antworten:
Es ist, weil Sie tatsächlich sagen:
Und nicht das, was Sie zu sagen glauben:
Sie werden feststellen, dass unabhängig von der Anzahl der Variablen, die Sie Ihrer Kette hinzufügen, nur die ersten (a) den Fehler verursachen.
Dies liegt daran, dass "let" Ihre Variable auf den Block (oder "lokal", mehr oder weniger "in Klammern") bezieht, in dem Sie sie deklarieren.
Wenn Sie eine Variable ohne "let" deklarieren, wird die Variable global erfasst.
In der Funktion, in der Sie Ihre Variablen festlegen, erhält alles den Wert 10 (Sie können dies im Debugger sehen, wenn Sie einen Haltepunkt setzen). Wenn Sie in dieser ersten Funktion ein Konsolenprotokoll für a, b, c einfügen, ist alles in Ordnung.
Aber sobald Sie diese Funktion verlassen, "verschwindet" die erste (a) - und denken Sie daran, technisch gesehen in der Reihenfolge der Zuordnung, es ist die letzte - "wieder können Sie dies in der sehen Debugger, wenn Sie in der zweiten Funktion einen Haltepunkt setzen), die anderen beiden (oder wie viele Sie hinzufügen) jedoch noch verfügbar sind.
Dies liegt daran, dass "let" NUR FÜR DIE ERSTE VARIABLE in der Kette gilt (also nur für lokale Bereiche) - wiederum technisch gesehen die letzte, die deklariert und mit einem Wert versehen wurde. Der Rest hat technisch gesehen kein "Lassen" vor sich. Diese werden also technisch global deklariert (dh auf dem globalen Objekt), weshalb sie in Ihrer zweiten Funktion angezeigt werden.
Probieren Sie es aus: Entfernen Sie das Schlüsselwort "let". Alle Ihre Vars sind jetzt verfügbar.
"var" hat einen ähnlichen Effekt im lokalen Bereich, unterscheidet sich jedoch darin, wie die Variable "gehisst" wird. Dies sollten Sie unbedingt verstehen, aber nicht direkt mit Ihrer Frage in Verbindung bringen.
(Übrigens würde diese Frage genug Pro-JS-Entwickler überraschen, um sie zu einer guten zu machen).
Es wird dringend empfohlen, Zeit mit den Unterschieden zu verbringen, wie Variablen in JS deklariert werden können: ohne Schlüsselwort, mit "let" und mit "var".
quelle
var
Sielet
im Rahmen dieser Antwort über? Ich verstehe nichtvar
kann bei unachtsamer Verwendung zu Fehlern neigen. Überprüfen Sie diese Geigevar
hat jeden Vorteil gegenüberlet
? Lassen Sie mich klarstellen: Ein moderner Kontext, wenn beide Optionen sind und ich nach Code frage, den man schreiben sollte . Als ich dies zuvor gefragt habe, habe ich Antworten zu "Sie können eine Variable mit neu deklarieren mitvar
" erhalten. In diesem Fall muss ich die Leute daran erinnern, dass Sie Variablen nicht erneut deklarieren sollten . Dies ist entweder ein Fehler oder ein Fehler in der Logik des Codes. Der Vorteil einer erneuten Deklaration besteht also darin, dass Sie fehlerhaften Code schreiben können. Ich habe noch keinen vernünftigen Grund dafür gesehen,var
wann dieslet
ebenfalls eine Option ist.In der Funktion
first()
werden Variablenb
undc
im laufenden Betrieb ohne Verwendung vonvar
oder erstelltlet
.Ist anders als
Sie werden implizit global. Deshalb sind sie in verfügbar
second()
Aus der Dokumentation
Um dies zu vermeiden, können Sie
"use strict"
Fehler verwenden, wenn eine nicht deklarierte Variable verwendet wirdquelle
let a = 10, b = 10, c = 10;
oderlet a, b, c; a = b = c = 10;
wäre sonst die richtige Art, die Variablen zu deklarieren.b
wird nicht ausgewertet / erreicht, der Fehler tritt in der Zeile auflet a = b = c = 10;
, die von rechts nach links gelesen wird .c
Da dies die erste verursachende Variable istReferenceError
, wird der Rest der Zeile nicht ausgeführt (das Skript wurde gestoppt)let a = 10, b = a, c = b;
ist auch gültigBevor Sie die Dinge als seltsam bezeichnen, sollten Sie zunächst einige Grundlagen kennen:
var und let werden beide für die Variablendeklaration in JavaScript verwendet. Zum Beispiel,
Variablen können auch ohne
var
oder deklariert werdenlet
. Zum Beispiel,Nun ist der Unterschied zwischen den oben genannten Ansätzen ist , dass:
var
ist funktionsbezogenund
let
ist blockumfangig.Schauen wir uns nun nach diesen Konzepten den fraglichen Code an:
quelle
var
Schlüsselwort deklarierten Variablen wird global, unabhängig davon, wo er deklariert wird" sollte entweder "der Umfang ... wird" oder "der Bereiche ... werden " . Um die genauen Wörter eines anderen zu verwenden, muss zitiert werden, ob von hier oder anderswo. meta.stackexchange.com/q/160071/211183Variablen, die das
let
Schlüsselwort verwenden, sollten nur im Rahmen des Blocks und nicht in einer externen Funktion verfügbar sein ...Jede Variable, die Sie auf diese Weise deklarieren, verwendet
let
oder nichtvar
. In der Variablendeklaration fehlt ein Komma.Es wird nicht empfohlen , eine Variable ohne das
var
Schlüsselwort zu deklarieren . Es kann versehentlich eine vorhandene globale Variable überschreiben. Der Umfang der ohne dasvar
Schlüsselwort deklarierten Variablen wird global, unabhängig davon, wo sie deklariert sind. Auf globale Variablen kann von überall auf der Webseite zugegriffen werden.quelle
Es liegt daran, dass wenn Sie nicht verwenden
let
odervar
dann Variable im laufenden Betrieb deklariert wird, es besser ist, wenn Sie wie folgt deklarieren.quelle
Das seltsame Problem wird durch Gültigkeitsbereichsregeln in JavaScript verursacht
Angenommen, Sie möchten 3 lokale Variablen deklarieren , die mit demselben Wert (100) initialisiert wurden. Ihr erstes () wird wie folgt aussehen. In diesem Fall hat second () keinen Zugriff auf eine der Variablen, da diese lokal für first () sind.
Wenn Sie jedoch globale Variablen möchten, sieht Ihr first () wie folgt aus. In diesem Fall hat second Zugriff auf alle Variablen, da sie sich im globalen Bereich befinden
Lokale Variablen (auch bekannt als im Codeblock zugänglich, in dem sie deklariert sind).
Ein Codeblock ist ein beliebiges {} mit Codezeilen dazwischen.
Globale Variablen (auch bekannt als im globalen Bereich zugänglich).
Diese Variablen werden an das globale Objekt angehängt. Das globale Objekt ist umgebungsabhängig. Es ist das Fensterobjekt in Browsern.
Besonderer Hinweis: Sie können Variablen in JavaScript deklarieren, ohne die Schlüsselwörter var, let, const zu verwenden. Eine auf diese Weise deklarierte Variable wird an das globale Objekt angehängt und ist daher im globalen Bereich verfügbar.
a = 100 // is valid and is in global scope
Einige Artikel zur weiteren Lektüre: https://www.sitepoint.com/demystifying-javascript-variable-scope-hoisting/ https://scotch.io/tutorials/understanding-scope-in-javascript https: //www.digitalocean .com / community / tutorials / verständnisvariablen-scope-hoisting-in-javascript
quelle
Der Hauptunterschied besteht in den Geltungsbereichsregeln. Mit dem Schlüsselwort var deklarierte Variablen werden auf den unmittelbaren Funktionskörper (daher der Funktionsumfang) beschränkt, während Variablen auf den mit {} bezeichneten unmittelbaren umschließenden Block (daher der Blockumfang) abgelegt werden. Und wenn du sagst
c und b haben eine Lebensdauer, die Spaß macht, aber nur eine Blockspanne hat. Wenn Sie versuchen, durch Referenzieren auf a zuzugreifen, wird immer ein Fehler angezeigt, aber c und b sind global, sodass dies nicht der Fall ist. Sie werden feststellen, dass es egal wie viele sind Variablen, die Sie zu Ihrer Kette hinzufügen, sind nur die ersten (a), die den Fehler verursachen. Dies liegt daran, dass "let" Ihre Variable auf den Block bezieht (oder "lokal" mehr oder weniger "in Klammern" bedeutet). Wenn Sie eine Variable ohne "let" deklarieren, wird die Variable global erfasst. In der Funktion, in der Sie Ihre Variablen festlegen, erhält alles den Wert 10 (Sie können dies im Debugger sehen, wenn Sie eine eingeben Haltepunkt). Wenn Sie ein Konsolenprotokoll für a, b, c in diese erste Funktion einfügen, ist alles in Ordnung. Sobald Sie diese Funktion verlassen, die erste (a) - und denken Sie erneut daran:
quelle
Hier sind die 3 interessanten Aspekte von Variablendeklarationen in JavaScript:
var beschränkt den Gültigkeitsbereich der Variablen auf den Block, in dem sie definiert ist. ( 'var' ist für den lokalen Bereich .)
let ermöglicht das vorübergehende Überschreiben des Werts einer externen Variablen innerhalb eines Blocks.
Durch einfaches Deklarieren einer Variablen ohne var oder let wird die Variable global, unabhängig davon, wo sie deklariert ist.
Hier ist eine Demo von let , die neueste Ergänzung der Sprache:
Ausgabe:
Erläuterung:
Die Variablen a und b wurden in ' first () ' ohne var- oder let-Schlüsselwörter delcared .
Daher sind a und b global und daher während des gesamten Programms zugänglich.
In der Funktion 'second' setzt die Anweisung 'let a = 5' den Wert von ' a ' vorübergehend auf ' 5 ', nur im Rahmen der Funktion.
Außerhalb des Bereichs von ' second () ', IE, wird im globalen Bereich der Wert von ' a ' wie zuvor definiert sein.
quelle