Hoisting
Mit Hoisting (englisch, Hochziehen) bezeichnet man das Verhalten einer JavaScript-Engine bei der Deklaration von Variablen und Funktionen in Funktionen.
Stößt der JavaScript-Interpreter auf eine Funktion, so überprüft er zunächst in der gesamten Funktion, welche Variablen im lokalen Gültigkeitsbereich der Funktion definiert werden und welche global definiert wurden. Werden Variablendefinitionen mit lokalem Gültigkeitsbereich gefunden, so werden diese gleich deklariert, nicht aber initialisiert. Der JavaScript-Interpreter „zieht“ also sämtliche Deklarationen von Variablen im Funktionsrumpf gleich unterhalb des Kopfes der Funktion hoch (Hoisting).[1] Die Zuweisung findet aber erst an jenen Stellen statt, wo die Variablen definiert sind.
var s = "hallo"; // globale Variable
function foo() {
document.write(s); // ergibt "undefined" und nicht "hallo"
var s = "test"; // Initialisierung von 's'
document.write(s); // ergibt "test"
}
foo();
Der obenstehende Code wird vom JavaScript-Interpreter so ausgeführt, als wäre Untenstehendes definiert worden:
var s = "hallo"; // globale Variable
function foo() {
var s; // Hoisting von s, das global definierte s wird damit überdeckt
document.write(s); // ergibt "undefined" - jetzt wird auch klar, warum!
s = "test"; // Zuweisung
document.write(s); // ergibt "test"
}
foo();
Ebenso werden die Deklaration von Funktionen nach vorne gezogen, wie das untenstehende Beispiel zeigt. Der Javascript-Interpreter schiebt die Deklaration und Implementierung(!) der Funktionsdefinition von foo ganz an den Anfang, sodass foo() sogar aufgerufen werden kann! Die Deklaration von bar wird ebenso an den Anfang verschoben, nicht hingegen die Implementierung der anonymen Funktion. Daher löst bar() einen Fehler aus.
document.write(typeof foo); // ergibt "function"
foo(); // wird daher ausgeführt
document.write(typeof bar); // ergibt wieder "undefined" - siehe obiges Beispiel!
bar(); // löst daher einen Fehler aus
function foo() {}; // Funktionsdefinition - Hoisting von Deklaration und Implementierung
var bar = function () {}; // literale Definition - nur Hoisting der Deklaration
Diesen Umstand kann man bei der Aufnahme von Unterfunktionen nutzen, indem man diese unterhalb der abschließenden return-Anweisung definiert.
function f(x) {
var y = foo(x); // Hoisting von foo
return y; // abschließendes return
function foo(z) {return z*z}; // Funktionsdefinition unterhalb von return
}
f(2); // ergibt 4
Hoisting tritt nicht nur innerhalb von Funktionen, sondern auch im globalen Kontext auf, jedoch sollte man die globale Definition von Variablen vermeiden.
Literatur
- Zachary Kessin: Programming HTML5 Applications Building Powerful Cross-platform Environments in JavaScript. Verlag O’Reilly Media, Sebastopol, CA 2011, ISBN 978-1-4493-9908-5.
Einzelnachweise
- ↑ Umgang mit Javascript-Variablen. auf: heise.de, abgerufen am 20. Dezember 2012.
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.