• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[FRAGE] Function declaration nicht "hoisted" und wird daher nicht ausgeführt

Joller

New member
Hallo,

die folgende Funktion wird nicht ausgeführt. Sie wird jedoch ausgeführt, wenn der setTimeout nach der Funktionsdeklaration der Funktion repeat gesetzt wird. Warum? Es ist doch eine "function declaration" und keine "function expression" und "function declarations" werden doch "hoisted". Habe diverse Beiträge zu meinem Thema gesucht und auch gefunden (z.B. JavaScript function declaration and evaluation order), jedoch keine Lösung gefunden.
Code:
1 function getNow() {
2	var now = new Date();
3	return now;
4 }
5 function myFunction() {
6 	document.getElementById("head").innerHTML = getNow();
7 }
8 function invoke(f, start, interval, end) {
9 	if (!start)
10		start = 0;
11	if (arguments.length <= 2)
12		setTimeout(f, start);
13	else {
14		setTimeout(repeat, start);         <== verschieben in Zeile 22, dann geht es
15		function repeat() {
16			var h = setInterval(f, interval);
17			if (end)
18				setTimeout(function() {
19					clearInterval(h);
20				}, end);
21		}
22	}
23}

Die Funktion ist aus dem Buch "JavaScript: The definitive guide", 6. Aufl. Seite 342

Gruß,

Joller

äh, hier noch der Code zum Kopieren ohne Zeilenangaben

Code:
function getNow() {
	var now = new Date();
	return now;
}
function myFunction() {
	document.getElementById("head").innerHTML = getNow();
}
function invoke(f, start, interval, end) {
	if (!start)
		start = 0;
	if (arguments.length <= 2)
		setTimeout(f, start);
	else {
		setTimeout(repeat, start);
		function repeat() {
			var h = setInterval(f, interval);
			if (end)
				setTimeout(function() {
					clearInterval(h);
				}, end);
		}
	}
}
 
Zuletzt bearbeitet:
Funktionsdeklarationen sollte man sowieso nicht in if...else..., while, switch oder Ähnliche packen. Der Code funktioniert, wenn du die Funktionsdeklaration hinter den else-Block packst.

Ich habe was im Kopf, dass mit ECMA 6th Edition sich das Hoisting in solchen Konstrukten geändert hat. So funktioniert dein Code im IE noch wunderbar.
 
Zurück
Oben