Warum hebt JavaScript Variablen an?

92

Warum hebt JavaScript Variablen an?

Was war das Grundprinzip der Designer, als sie beschlossen, das Heben zu implementieren? Gibt es andere beliebte Sprachen, die dies tun?

Bitte geben Sie relevante Links zu Dokumentationen und / oder Aufzeichnungen an.

Xlaudius
quelle
7
Ich vermute an dieser Stelle, dass es historisch ist, und ich bezweifle ernsthaft, dass es ursprünglich etwas anderes als "einfache Implementierung" war.
Dave Newton
4
Ehrlich gesagt, fragen Sie Brendan Eich, er scheint ziemlich reaktionsschnell zu sein.
Felix Kling
21
Wie ist diese Frage nicht konstruktiv?
Francisc
17
@Francisc Willkommen bei Stack Overflow, wo Sie nur nach einem Umzug divin jQuery
Xlaudius
17
Dies ist eine wirklich wichtige Frage. Es hätte erlaubt sein sollen. Es war kein Flammenköder. Das Heben ist eines der Kernelemente für das Verständnis der Funktionsweise von JavaScript, und das "Warum" ist eine legitime Frage, die in den meisten Lehrbuchbehandlungen der Sprache behandelt wird. Es ist NICHT in Ordnung, dass Leute mit Stapelüberlauf STÄNDIG auf solche Fragen stampfen.
Bearvarine

Antworten:

54

Wie Stoyan Stefanov im Buch "JavaScript Patterns" erklärt, ist das Heben das Ergebnis der Implementierung eines JavaScript-Interpreters.

Die JS-Code-Interpretation wurde in zwei Durchgängen durchgeführt. Während des ersten Durchgangs verarbeitet der Interpreter Variablen- und Funktionsdeklarationen.

Der zweite Durchgang ist der eigentliche Codeausführungsschritt. Der Interpreter verarbeitet Funktionsausdrücke und nicht deklarierte Variablen.

Daher können wir das "Hebe" -Konzept verwenden, um ein solches Verhalten zu beschreiben.

lxgreen
quelle
15
Ich persönlich mag das Wort "Heben" wirklich nicht. Es gibt die falsche Darstellung, dass Variablen- und Funktionsdeklarationen auf magische Weise an die Spitze des aktuellen Bereichs gehoben werden. In Wirklichkeit durchsucht der JS-Interpreter, wie Sie bereits erwähnt haben, den Quellcode nach den Bindungen und führt dann den Code aus.
Kontaktmatt
Jetzt habe ich verstanden, warum JS die Sprache am meisten missverstanden hat. Ich habe dies in keinem Tutorial gesehen. Und wurde mit dem Heben (und dem Dolmetscherfluss) verwechselt.
Swapnil Patwa
17
Äh, das erklärt die Gründe nicht wirklich. Ein Single-Pass-Dolmetscher (der nicht zum Heben geführt hätte) wäre viel einfacher gewesen - warum haben sich die Designer für zwei Durchgänge entschieden?
Bergi
1
Dies erklärt nicht, warum Variablen, insbesondere, angehoben werden. Funktionen sind sinnvoll, Variablen nicht (in den meisten Fällen) - ich glaube, es ist ein Fehler.
Josh M.
Josh M. Dies ist so ausführlich spezifiziert, dass ich nicht denke, dass dies ein "Fehler" ist ... (Ich stimme zu, dass diese Antwort die Argumentation jedoch nicht wirklich beantwortet)
Jonas Wilms
9

JS-Schöpfer Brendan Eich sagte einmal (auf Twitter) :

"var hoisting war somit [eine] unbeabsichtigte Folge des Funktionshebens, kein Blockumfang [und] JS als Eiljob von 1995."

Er erklärte auch, dass ...

"Das Heben von Funktionen ermöglicht die Zerlegung von Top-Down-Programmen. 'Lassen Sie rec' kostenlos, rufen Sie vor dem Deklarieren auf.

Brendan Eich

Gibt es andere beliebte Sprachen, die dies tun?

Ich kenne keine anderen populären Sprachen, die Variablen auf die gleiche Weise heben. Ich denke, selbst ActionScript - eine andere Implementierung von ECMAScript, die in der Flash-Entwicklung verwendet wird - hat das Heben nicht implementiert. Dies war eine Quelle der Verwirrung und Frustration für Entwickler, die mit anderen Sprachen vertraut sind, die JavaScript lernen.

UPDATE: Aus den Kommentaren geht hervor, dass Python ein ähnliches Verhalten beim variablen Heben aufweist .

Gfullam
quelle
2
Eine +1 zu geben, da dies die einzige Antwort ist, die versucht, die Frage direkt zu beantworten.
Damon
1
Vielen Dank für diese Antwort. Ich stimme @Damon voll und ganz zu!
Codingbryan
1
Eine andere beliebte Sprache mit variablem Heben ist Python: stackoverflow.com/q/63337235/2326961
Maggyero
2

Dies liegt daran, dass der Javascript-Interpreter den Code in zwei Zyklen interpretiert.

  1. Code-Vervollständigung / Kompilierung:
  2. Codeausführung:

Im ersten Zyklus alle Variable und Funktionsdeklarationen sind auf der Oberseite des Funktionsumfangs genommen es in ausgeführt wird . Dies hilft bei der Erstellung variableObjectsfür execution contextFunktions , noch bevor es die Ausführung.

In der 2. Phase erfolgen Wertzuweisungen, Code-Anweisungen und Funktionsaufrufe erwartungsgemäß zeilenweise.

Sie haben hier etwas ausführlicher gelesen .

Es werden Ihnen ein besseres Bild um Verhalten um let, constund classErklärungen, auch den Vorrang es zwischen variablen und Funktionen folgt.

Jaspreet Singh
quelle
1
Wollen Sie damit sagen, dass dies eine Folge einer Designentscheidung ist? Wenn ja, sollten Sie dies in Ihrer Antwort klar angeben. Aber wenn man Brendan Eichs Antwort liest, könnte es ein gewünschtes Feature gewesen sein, es hängt davon ab, wie man den letzten Satz interpretiert. Unterm Strich weiß ich immer noch nicht warum
Bombinosh