2010-05-02 22 views
6

Estoy escribiendo una aplicación en javascript y no puedo entender cómo acceder a las variables declaradas en mi función, dentro de este jquery analizar. En el interior puedo acceder a variables globales, pero realmente no quiero crear valores globales para estos valores.¿Cómo puedo acceder a variables fuera del alcance actual en javascript?

Básicamente quiero extraer nombres de archivos de un documento xml en la variable simulationFiles. Compruebo si el atributo del nodo es igual al simName y extraigo las dos cadenas dentro de los elementos xml, esa parte creo que está funcionando.

¿Cómo puedo extraer esos elementos xml y anexarlos a las 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(); 
     } 
    }); 
} 

Respuesta

13

El this en la función CsvReader no es lo mismo this en el each() de devolución de llamada (en la que en cambio es el elemento actual en la iteración). Para acceder al ámbito de la función externa dentro de la devolución de llamada, tenemos que ser capaces de hacer referencia a ella por otro nombre, que se puede definir en el ámbito exterior:

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

Gracias por la respuesta rápida, pero desafortunadamente eso no funciona. En realidad, lo intenté también antes, pero dentro de la función sin nombre, el $ self se informa como no definido por Firebug. – sekmet64

+0

¡Funciona así! Lo siento, cuando guardé esto en una variable tuve un error diferente después de esta llamada a la función y cuando depuré el depurador me mostró que $ self.initFileName no está definido en el interior, pero en realidad estaba funcionando y obtuve el resultado. ¡Muchas gracias! – sekmet64

+0

¿Se supone que su 'this.initFileName' y' this.eventsFileName' son locales para su función o para toda la página? Nm ... vi tu publicación unos segundos más tarde. ¡Me alegra que funcione! –

4

hice un working demo (lo cambié a utilizar clases para que funcione con 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

Este método funcionó muy bien, ¡gracias! Lo siento pero la falla del depurador me llevó un poco y me enseñó que no estaba funcionando. – sekmet64

Cuestiones relacionadas