2012-05-04 17 views
12

quiero para albergar una variable en función Esta variable cambiará de estado en función de la interacción del usuariomantener viva la variable en una función de JavaScript

function plan_state(current){ 
    if (current != ''){ 
    state = current; 
    } 
    else { 
    return state; 
    } 
} 

cuando se carga el doc que llamo plan_state ('yo');

cuando ocurren ciertas cosas que podríamos llamar plan_state ('amado')

el problema, corro una función y desea comprobar el estado actual ..

alert(plan_state()); 

me sale indefinido hacia atrás y al lo mínimo es que debería ser 'yo' cuando lo configuro.

¿Qué estoy haciendo mal?

+2

¿dónde declaras el estado? – Loktar

+0

se declara en la función onload estableciéndolo en 'me'? –

Respuesta

33

La función no es con estado debido a que la variable de estado se declara dentro de la función y, por tanto, sólo existe durante toda la vida de la llamada de función. Una solución fácil sería declarar la variable globalmente, fuera de la función. Esto es badbadbadbad.

Un mejor enfoque es utilizar el module pattern. Este es un patrón esencial que debe conocer si se toma en serio el desarrollo de JavaScript. Permite que el estado por medio de (variables privadas) internos y expone una serie de métodos o funciones para cambiar o conseguir el estado (como la programación orientada a objetos)

var stateModule = (function() { 
     var state; // Private Variable 

     var pub = {};// public object - returned at end of module 

     pub.changeState = function (newstate) { 
      state = newstate; 
     }; 

     pub.getState = function() { 
      return state; 
     } 

     return pub; // expose externally 
    }()); 

por lo stateModule.changeState("newstate"); establece el estado

y var theState = stateModule.getState(); obtiene el estado

+0

esto es genial. Creo que esto es más de lo que estoy buscando y aunque no lo entiendo completamente ... TODAVÍA ... lo estoy aceptando como respuesta ya que estaba evitando el problema de la variable global. Gracias. –

+0

funciona !! y después de implementarlo y jugar con él, lo entendí ... tuvo que cambiar ChangeState para cambiar State por cierto ... o viceversa. –

+0

Me alegro de que haya ayudado.Usando ese patrón, serás un ninja de JavaScript en muy poco tiempo. Arreglé la función call error de llamada thx para señalarlo. – reach4thelasers

1

Creo que el alcance de su variable es demasiado "bajo"; al definir la variable dentro de la función, ya sea como parámetro o explícitamente como var, solo se puede acceder a ella dentro de la función. Para lograr lo que busca, puede implementar la variable fuera del alcance de la función, en un nivel más global (no recomendado en realidad).

Sin embargo, después de volver a leer su pregunta, es un poco extraño. ¿No le gustaría devolver state independientemente del current? Creo que es posible que después de algo como así:

var state; 
function plan_state(current) 
{ 
    if (current != '' && current != state) 
    { 
     state = current; 
    } 
    return state; 
} 

estructura del objeto Alternativa:

function StateManager(state) 
{ 
    this.state = state; 

    this.getState = function(current) 
    { 
     if (current != '' && current != this.state) 
     { 
      this.state = current; 
     } 
     return this.state; 
    } 
} 

// usage 
var myStateManager = new StateManager("initial state here"); 
var theState = myStateManager.getState("some other state"); 
+0

pensé que al alojar la variable en una función, era una forma de evitar los globales –

+1

Al declarar una variable dentro de una función no es global, eso es correcto. Sin embargo, la vida útil de esa variable solo está activa mientras se usa la función. Cuando la función existe, la variable "ya no existe". Es posible que desee considerar un objeto :) – Richard

+0

Gracias Richard –

Cuestiones relacionadas