JavaScript-Bereich in einem try-block
Sagen, dass ich versuche, führen Sie dieses JavaScript-snippet. Übernehmen die nicht deklarierten vars und Methoden deklariert sind, anderswo, oben, und dass something
und somethingElse
bewerten zu boolean-true.
try {
if(something) {
var magicVar = -1;
}
if(somethingElse) {
magicFunction(magicVar);
}
} catch(e) {
doSomethingWithError(e);
}
Meine Frage ist: was ist der Umfang der magicVar
und ist es okay, pass es in magicFunction
wie ich es getan habe?
- Es scheint mir, wie dieser gerade eine Frage über den Geltungsbereich von Variablen nicht Geltungsbereich von Variablen in einem try-block.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Javascript-Funktionsumfang. Das bedeutet, dass
magicvar
existieren wird, vom Anfang der Funktion deklariert werden, die in den ganzen Weg bis zum Ende der Funktion, auch wenn diese Aussage nicht immer ausführen. Dies wird als variable Hubgeschwindigkeit. Das gleiche passiert mit Funktionen-Deklarationen, die wiederum aufgerufen wird Funktion hochziehen.Wenn die variable deklariert ist, in globalen Bereich, es wird sichtbar sein alles. Dies ist Teil der Grund, warum Globale Variablen werden als das böse in Javascript.
Deinem Beispiel passieren
undefined
inmagicFunction
wennsomething
ist falsch, weilmagicVar
noch nicht zugewiesen wurde, zu nichts.Dies ist zwar technisch gültiges Javascript, ist es im Allgemeinen als schlechter Stil und wird nicht passieren-Stil-checker wie jsLint. Extrem unintuitiv Javascript wie diese ausführen, ohne jede Fehlermeldung
POP QUIZ: Was macht der folgende code?
undefined
sowieso, weilwindow.a
istundefined
alert(a)
alle von selbst, wird es werfen eine Fehlermeldung wiea is 'undefined'
.a
kann undefiniert, weil es undefiniert in outerscope. Werfen Sie einen Blick auf dieses demo, Wenn Sie entfernen dievar x
Sie immer noch das gleiche Ergebnis erhalten.avoid extended discussions in comments.
Viele andere gute Antworten darüber, wie Javascript behandelt diese mit
var
, aber ich dachte, ich hätte die Adresse, dielet
situation...Ob eine variable definiert ist, mit
let
innerhalb dertry
block, es wird NICHT im Geltungsbereich innerhalb dercatch
(oderfinally
) block(s). Es müsste definiert werden, in dem umschließenden block.Beispielsweise in den folgenden code-block, der die Ausgabe in der Konsole wird "Außerhalb":
var
Möchten Sie vielleicht zu Lesen MDN Umfang cheat sheet
Aufgrund
hoisting
können Sie auch tun, Dinge wie diese:Demo
Also die
foo
- Funktion umgewandelt wird, so etwas wie dieses:Definieren okay..., ja der code ist gültig, aber es ist weniger lesbare dann, wenn die Variablen-Deklarationen waren auf der Oberseite, das ist alles.
Durch javascript "hochziehen" (google es), Ihre Deklaration von Variablen code wird übersetzt als:
"Hochziehen" bewegt alle Variablen-Deklarationen an den Anfang der Funktion. So
magicVar
ist verfügbar überall in der Funktion, aber es ist undefiniert, bis Sie ihm einen Wert.Deine variable hat den Gültigkeitsbereich von Funktionen.
Mit
var
, Variablen existieren, die vom Anfang der Funktion bis Ende, egal, wo Sie deklariert sind, oder selbst wenn die Aussage eigentlich nie erreicht. Sie werden jedoch von denundefined
bis Sie ein anderer Wert zugeteilt.Also in deinem Fall, wenn
something
ist falsch, abersomethingelse
ist wahr, Sie rufenmagicFunction
mit dem ersten argument wirdundefined
.Den
let
Schlüsselwort Javascript erstellt 1.9 und verfügbar (Stand heute, Mai 3rd 2012, und so weit ich weiß) nur in Firefox, deklariert Variablen mit dem Gültigkeitsbereich Semantik, die Sie wahrscheinlich gewöhnt sind.Ich Stimme mit variabler Förder-und Funktion hochziehen, möchte ich betonen zwei Punkte importieren.
Identifier, Definiert in der Catch-parameter ist, d.h. err/e(error) , bezieht sich auf Catch-block definiert.
Funktion zuerst hochziehen.
Beispiel :