SkiD: Anonyme Funktion / this-Referenz durchschleifen!

Hallo,

ich habe gerade eine etwas seltsames Problem.
Ich habe eine Anonyme Funktion für eine XMLHttpRequest gebastelt, wenn der Status sich ändert (onreadystatechange).
Problem ist hier das ich auf die eigentlich this-Referenz nicht mehr zugreifen kann.

Hier mein Code:

  
fProt.prototype.readXML = function(URL)  
{  
  var req = this.createHttpRequest();  
  req.open("GET", URL, true);  
  req.onreadystatechange = function()  
  {  
    if(req.state == 4)  
    {  
      if(req.status != 200)  
        alert("ERROR");  
      else  
        this.parseXML(req.responseText);  //<---  
    }  
  };  
  req.send(null);  
};  
  
fProt.prototype.parseXML = function(TEXT)  
{  
  alert(TEXT);  
}  

Wie man allerdings an der Stelle mit dem Kommentar sieht, existiert dort die this-Referenz meines Objektes nicht mehr, sondern nur die this-Referenz meien req-Objektes!

Klar wäre es möglich ab hier ohne Funktionen des eigenen Objektes weiter zu arbeiten, dass möchte ich jedoch nicht, da die parseXML-Funktion eine Funktion des Objektes sein soll.

Könnt ihr mir da helfen ?

Danke und Grüße,
SkiD.

  1. Problem ist hier das ich auf die eigentlich this-Referenz nicht mehr zugreifen kann.

    Ja, daher musst du eine lokale Kopie von this anlegen, die du dann in der Funktion nutzen kannst.

    Struppi.

    1. Ja, daher musst du eine lokale Kopie von this anlegen, die du dann in der Funktion nutzen kannst.

      Okay also ich habe das Problem gelöst.
      Ich habe einfach der XMLHttpRequest die This-Referenz hinzugefügt.

      Ich fand es nur etwas seltsam, da es für mich umständlich wirkt.
      Auf Globalität versuche ich in meinen Projekten soweit es geht zu verzichten.

      Mittels lokale Kopie so gemeint (?) :

        
      var gThis = null; //<---  
        
      fProt.prototype.readXML = function(URL)  
      {  
        var req = this.createHttpRequest();  
        
        gThis = this; //<---  
        req.open("GET", URL, true);  
        req.onreadystatechange = function()  
        {  
          if(req.state == 4)  
          {  
            if(req.status != 200)  
              alert("ERROR");  
            else  
              this.parseXML(req.responseText);  
          }  
        };  
        req.send(null);  
      };  
      
      

      Danke dir für deine Hilfe!

      SkiD.

      1. Mittels lokale Kopie so gemeint (?) :
        var gThis = null; //<---

        Nein.

        fProt.prototype.readXML = function(URL)
        {
          var req = this.createHttpRequest();

        gThis = this; //<---

        Ja. Aber hier mit var

        var gThis = this; //<---

        req.open("GET", URL, true);
          req.onreadystatechange = function()
          {
            if(req.state == 4)
            {
              if(req.status != 200)
                alert("ERROR");
              else
                this.parseXML(req.responseText);

        und hier dann:
        gThis.parseXML(req.responseText);

        Struppi.