Methoden und setTimeout
Horst
- javascript
Ist es innerhalb von Methoden nicht möglich setTimeout zu verwenden?
Beispiel:
function methode() {
alert (this.countdown);
if (this.countdown--) setTimeout('this.methode()', 1000);
}
Das hat nicht funktioniert. Im zweiten Durchlauf ist this.countdown nicht mehr in der Funktion bekannt. Ersetze ich setTimeout('this.methode', 1000); durch this.methode(); funktioniert es. Die Verzögerung würde ich auch ohne setTimeout hinkriegen, aber ist das nicht eine unsaubere Lösung, weil es rekursiv ist?
Ich hoffe, ich habe mich einigermaßen verständlich ausgedrückt und mich nicht zu kurz gefaßt.
hallo horst,
das problem ist vermutlich, dass setTimeout das kommando in deinem fall "this.methode()" auf der topscript-ebene aufruft.
wie wenn du ausserhalb der funktion "this.methode()" aufrufen würdest.
das gleiche gilt übrigens auch für eval().
der kommandoteil wird also nochmals durch den interpreter geschickt.
auch wenn du deinen aufruf in der funktion definierst ist die ausführung nicht rekursiv.
es kommt überhaupt nicht darauf an wo du setTimeout bzw. eval notierst.
die ausführungsumgebung ist immer das toplevel-script. leider ;-(
du musst also mit globalen variablen arbeiten.
gruss lenaluna
Hallo,
Ist es innerhalb von Methoden nicht möglich setTimeout zu verwenden?
Doch, sofern du statt eines Strings eine Funktion übergibst, ist es durchaus möglich.
Beispiel:
function methode() {
alert (this.countdown);
if (this.countdown--) setTimeout('this.methode()', 1000);
}
Ersetze das mal durch:
function methode() {
alert (this.countdown);
if (this.countdown--)
setTimeout(function(){
this.methode()
}, 1000);
}
mfg. Daniel
Hallo,
Ergänzung zu LenaLuna: Man muss nicht mit globalen Variablen arbeiten. Es gibt eine Möglichkeit:
function Obj () {
var self = this;
this.countdown = 10;
this.count = function () {
if (this.countdown--) {
alert(this.countdown);
window.setTimeout(
function () {
self.count();
},
1000
);
}
};
}
var o = new Obj;
o.count();
Grundvoraussetzung: Man kann setTimeout nicht nur Strings, sondern auch Funktionsobjekte übergeben.
Hier legt man eine Referenz auf die Instanz an (var self = this;). self ist auch in methode verfügbar, weil diese in in der (Konstruktor-)Funktion Obj notiert ist und damit Zugriff auf dessen lokale Variablen hat.
self ist dann aus demselben Grund in der anonymen Funktion verfügbar, die setTimeout übergeben wird. Der Effekt nennt sich »Closure«.
Die Hintergründe werden hier erklärt: Organisation von JavaScripten, insbesondere Methoden eigener Objekte in anderen Kontexten ausführen und Einführung/von Closures. Dort gibt es auch Beispiele mit setTimeout.
Eine verallgemeinerte Lösung, die konzeptionell gleich arbeitet, ist bind().
Mathias