2012-05-04 17 views
12

voglio per ospitare una variabile in una funzione Questa variabile cambia di stato a seconda dell'interazione dell'utentemantenendo variabili vivo in una funzione javascript

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

quando i carichi doc chiamo plan_state ('me');

quando certe cose accadono i può chiamare plan_state ('amato')

il problema, ho eseguito una funzione e voglio controllare lo stato attuale ..

alert(plan_state()); 

ottengo indefinita schiena e al il minimo è dovrebbe essere 'me' come ho impostato questo onload.

cosa sto facendo di sbagliato?

+2

dove dichiari lo stato? – Loktar

+0

è dichiarato nella funzione onload impostandolo su "me"? –

risposta

33

La funzione non è stateful perché la variabile di stato è dichiarata all'interno della funzione e quindi esiste solo per tutta la vita della chiamata di funzione. Una soluzione facile sarebbe dichiarare la variabile globalmente, al di fuori della funzione. Questo è badbadbadbad.

Un approccio migliore consiste nell'utilizzare lo module pattern. Questo è uno schema essenziale per imparare se sei serio sullo sviluppo di javascript. Permette stato mediante (variabili private) interne ed espone una serie di metodi o funzioni per modificare o di ottenere lo stato (come programmazione orientata agli oggetti)

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 
    }()); 

così stateModule.changeState("newstate"); imposta lo stato

e var theState = stateModule.getState(); ottiene lo stato

+0

questo è fantastico. Penso che questo sia più di quello che sto cercando e anche se non lo capisco del tutto ... ANCORA ... lo accetto come una risposta mentre evitavo il problema delle variabili globali. Grazie. –

+0

funziona !! e dopo averlo implementato e giocato con esso, lo capisco .. dovevo cambiare ChangeState per cambiareState a proposito ... o viceversa. –

+0

Felice di averlo aiutato.Usando quel modello sarai un ninja JavaScript in nessun tempo! Ho corretto la funzione call case error thx per indicarlo. – reach4thelasers

1

Credo che l'ambito della variabile sia troppo "basso"; definendo la variabile all'interno della funzione, come parametro o esplicitamente come var, è accessibile solo all'interno della funzione. Per ottenere ciò che cerchi, puoi implementare la variabile al di fuori dell'ambito della funzione, ad un livello più globale (non consigliato in realtà).

Tuttavia, dopo aver riletto la tua domanda, è un po 'mancare. Non vorresti restituire state indipendentemente dallo current? Credo che si potrebbe essere alla ricerca di qualcosa in questo modo:

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

struttura alternativa oggetto:

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

Ho pensato che alloggiando la variabile in una funzione era un modo per evitare le globali –

+1

Dichiarando una variabile all'interno di una funzione non è globale, è corretto. Tuttavia, la durata di tale variabile è attiva solo mentre la funzione è in uso. Quando la funzione esiste, la variabile "non esiste più". Si consiglia di prendere in considerazione un oggetto :) – Richard

+0

Grazie Richard –

Problemi correlati