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.
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
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: