setTimeout() und Funktionen vs. globaler Geltungsbereich

Zeussi

Grünschnabel
Hallo liebe tutorials.de Freunde,

ich möchte mittels der setTimeout() Funktion eine Funktion zu einem späteren Zeitpunkt ausführen. setTimeout() und die auszuführenden Funktion befinden sich in einem nicht globalen Geltungsbereich. Soll heißen es ist eine Funktion in einer Funktion, sowas wie eine Methode eines Objektes.

Also hab ich folgendes probiert:
Code:
[...]
// nicht globaler Bereich
setTimeout(this.aufruf(50), 2000);
[...]
Funktioniert aber leider nicht.

Dann wurde mir gesagt ich solle es doch so machen, was funktioniert:
Code:
// Globale Variable
var that = none;
[...]
// nicht globaler Bereich
that = this;
setTimeout(function(){that.aufruf(50);}, 2000);
[...]
Warum muss ich dort eine Funktion um die eigene Funktion basteln?
Okay wäre das gelöst. Aber damit sich Werte nicht überschreiben muss ich umbedingt die globale Variable wegkriegen. Wie mache ich das?

Also hab ich folgendes probiert (einfach globale Variable entfernt und lokal definiert):
Code:
[...]
// nicht globaler Bereich
// Lokale Variable
var that = this;
setTimeout(function(){that.aufruf(50);}, 2000);
[...]

Aber das geht nicht... ich komme aus der Java Welt und tue mich gerade sehr schwer das zu verstehen. Auch verstehe ich nicht warum ich extra das Funktions-Konstrukt um die aufruf-Funktion legen muss und war ich das this-Objekt nur mit einer globalen Variable benutzen kann. :-( Ich hoffe Ihr versteht mein Problem - falls nicht erklär ichs gerne anders :)
 
Zuletzt bearbeitet:
Hi,

setTimeout() erwartet eine Funktion.
Sowas gibt es natürlich auch in Java: http://stackoverflow.com/a/122414/603003

Du übergibst in JavaScript eine Funktion "als Variable", indem du die Klammern weglässt, sprich also nicht aufrufst. Denn sonst würdest du nur den Rückgabewert an setTimeout übergeben.

Folgendes wäre richtig:
Javascript:
setTimeout(myFunction, 2000);

Allerdings möchtest du ja auch noch Parameter angeben, also musst du eine Wrapper-Funktion erstellen:
Javascript:
setTimeout(function () {
    myFunction("my Param");
  },
  2000
);
Da brauchst du überhaupt kein globales Objekt. myFunction wird im untersten (lokalen) bis zu höchsten (globalen) Geltungsbereich gesucht.
 
Vielen Dank für Deine schnelle Antwort ComFreek :)

Also ich glaub ich hab mich nicht so deutlich ausgedrückt. Bei Dir die myFunction, diese ist eine Funktion innerhalb einer anderen Funktion. Sprich in dem Fall ist es eine Methode.

Wenn ich jetzt also die Funktion so aufrufe, dann passiert nichts, weil die Funktion nicht gefunden wird. Deswegen brauche ich das aktuelle Objekt wo sich die Methode myFunction befindet, also das this (gespeichert in that bei mir).

Sowas hier:
this.myFunction ...

Und jetzt kommt das eigentliche Problem:
- Das this muss global sein - wenn ich das this in einer lokalen Variable speicher geht es nicht.
- Ich will es aber nicht global speichern!

Warum will ichs nicht global speichern: ich kann nur ein Objekt insgesamt erzeugen, weil die this-Variable jedes mal wieder überschrieben wird :(

//edit:

also wenn ich das Objekt weglasse, in der sich die Methode (Funktion) befindet erhalte ich folgende Fehlermeldung, wobei meine aktuelle Methode (Funktion) startAnimation() heißt und sie mittels setTimeout() die Methode (Funktion) animate(50) aufruft:

Fehlermeldung mittels Opera Dragonfly ermittelt:
Code:
Uncaught exception: ReferenceError: Undefined variable: animate
Error thrown at line 196, column 49 in <anonymous function: startAnimation>() in http://localhost/gmaps/route_oop2.html:
    animate(50);	Timeout thread: delay 2000 ms
 
Zuletzt bearbeitet:
Soweit ich weiß, nennt man Funktionen nur Methoden, wenn Sie innerhalb einer Klasse definiert sind.
In JavaScript meinetwegen als Funktionen eines Objekts (z.B.: prototype).

Am einfachsten wäre es, wenn du einfach deinen Code zeigen würdest. "Code sagt mehr als 100 Worte" ;)


Allerdings wenn du das Problem hast, dass sich der Kontext (sprich das this-Objekt) verändert, dann kannst du es so wie ich es immer tue lösen:
Javascript:
var $this = this;

// nutze dann in einem unterem Codeblock dann $this anstatt von this!
 
Zuletzt bearbeitet von einem Moderator:
Wohooo es funktioniert :))
Also wenn Du in den ersten Post schaust da hab ich das genauso versucht wie Dus gerade vorgeschlagen hast, das Problem war nur, dass ich das lokale this von einem falschen Objekt noch in der gleichen Zeile dazwischengefunkt hat und ne Fehlermeldung geworfen hat was ich auf das falsche Objekt bezogen hab... au man!

Sorry also für den "Dummheitsfehler" und danke fürs Helfen :)
 
Zurück