2010-05-02 4 views
6

J'écris une application en javascript et je n'arrive pas à comprendre comment accéder aux variables déclarées dans ma fonction, à l'intérieur de cette analyse jquery. À l'intérieur, je peux accéder aux variables globales, mais je ne veux pas vraiment créer de variables globales pour ces valeurs.Comment puis-je accéder aux variables en dehors de la portée actuelle en javascript?

Fondamentalement, je veux extraire les noms de fichiers d'un document XML dans la variable simulationFiles. Je vérifie si l'attribut de noeud est égal à simName et extrait les deux chaînes à l'intérieur des éléments xml, cette partie je pense que cela fonctionne.

Comment puis-je extraire ces éléments xml et les ajouter à des variables locales?

function CsvReader(simName) { 
    this.initFileName = "somepath"; 
    this.eventsFileName = "somepath"; 
    $(simulationFiles).find('simulation').each(function() { 
     if ($(this).attr("name") == simName) { 
      initFileName += $(this).find("init").text(); 
      eventsFileName += $(this).find("events").text(); 
     } 
    }); 
} 

Répondre

13

Le this dans la fonction CsvReader est pas de même dans le rappel thiseach() (où il est à la place de l'élément courant dans l'itération). Pour accéder à la portée de la fonction externe dans le rappel, nous devons être en mesure de faire référence par un autre nom, que vous pouvez définir dans le champ extérieur:

function CsvReader(simName) { 
    this.initFileName = "somepath"; 
    this.eventsFileName = "somepath"; 
    var self = this; // reference to this in current scope 
    $(simulationFiles).find('simulation').each(function() { 
     if ($(this).attr("name") == simName) { 
      // access the variables using self instead of this 
      self.initFileName += $(this).find("init").text(); 
      self.eventsFileName += $(this).find("events").text(); 
     } 
    }); 
} 
+0

Thx pour la réponse rapide, mais malheureusement, cela ne fonctionne pas. En fait, je l'ai essayé aussi auparavant, mais à l'intérieur de la fonction sans nom, le $ self est signalé comme non défini par firebug. – sekmet64

+0

Cela fonctionne comme ça! Désolé à ce sujet, quand j'ai sauvé le ceci à une variable j'ai eu une erreur différente après cet appel de fonction et quand j'ai débogué le débogueur m'a montré que $ self.initFileName est indéfini à l'intérieur, mais réellement fonctionnait et et j'ai obtenu le résultat. Merci beaucoup! – sekmet64

+0

Vos 'this.initFileName' et' this.eventsFileName' sont-ils censés être locaux à votre fonction ou à la page entière? Nm ... a vu votre message quelques secondes plus tard. Content que ça marche! –

4

J'ai fait une working demo (je l'ai changé à utiliser classes donc ça fonctionnerait avec HTML).

function CsvReader(simName) { 
    this.initFileName = "somepath"; 
    this.eventsFileName = "somepath"; 
    var context = this; 
    $(simulationFiles).find('simulation').each(function() { 
     if ($(this).attr("name") == simName) { 
      context.initFileName += $(this).find("init").text(); 
      context.eventsFileName += $(this).find("events").text(); 
     } 
    }); 
} 
+0

Cette méthode a bien fonctionné, merci! Désolé mais le débogueur m'a manqué un peu et a enseigné que ça ne fonctionnait pas. – sekmet64

Questions connexes