2012-05-04 15 views
12

Chcę do domu zmienną w funkcji Zmienna ta ulegnie zmianie w zależności od stanu interakcji użytkownikautrzymanie przy życiu zmienna w funkcji javascript

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

po załadowaniu doc ​​zgłoszę plan_state („ja”);

gdy pewne rzeczy się zdarzają i może wywołać plan_state ('kochany')

problem, uruchomić funkcję i chcesz sprawdzić aktualny stan ..

alert(plan_state()); 

i dostać z powrotem i na niezdefiniowane przynajmniej powinno być "ja", gdy ustawiam to obciążenie.

co robię źle?

+2

gdzie deklarujesz stan? – Loktar

+0

jest zadeklarowany w funkcji onload przez ustawienie go na "mnie"? –

Odpowiedz

33

Funkcja nie jest Stateful ponieważ zmienna stan jest zadeklarowana wewnątrz funkcji, a zatem istnieje tylko dla życia wywołania funkcji. Łatwym rozwiązaniem byłoby zadeklarowanie zmiennej globalnie, poza funkcją. To jest badbadbad.

Lepszym rozwiązaniem jest użycie urządzenia module pattern. Jest to niezbędny wzór do nauki, jeśli poważnie myślisz o rozwoju javascript. Umożliwia stanu za pomocą wewnętrznych (zmiennych prywatnych) i odsłania szereg metod lub funkcji do zmiany lub uzyskanie stanu (jak programowanie obiektowe)

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

tak stateModule.changeState("newstate"); ustawia stan

i var theState = stateModule.getState(); dostaje stan

+0

to jest świetne. Myślę, że jest to bardziej tego, czego szukam i chociaż nie w pełni to rozumiem ... JESZCZE ... akceptuję to jako odpowiedź, ponieważ unikałem problemu zmiennej globalnej. Dzięki. –

+0

działa !! i po jego implementacji i graniu z nią, w pewnym sensie to rozumiem ... musiałem zmienić ChangeState, by changeState przy okazji ... lub vice versa. –

+0

Cieszę się, że pomogło.Używając tego wzoru będziesz błyskawicznym ninja JavaScript! Poprawiłem błąd przypadku wywołania funkcji thx, aby go wskazać. – reach4thelasers

1

Uważam, że zakres twojej zmiennej jest zbyt "niski"; poprzez zdefiniowanie zmiennej w funkcji, jako parametru lub jawnie jako var, jest dostępna tylko w obrębie funkcji. Aby osiągnąć to, czego szukasz, możesz albo zaimplementować zmienną spoza zakresu funkcji, w bardziej globalnym evel (nie poleconym naprawdę).

Jednak po ponownym przeczytaniu twojego pytania, jest to trochę chybione. Czy nie chcesz zwrócić state niezależnie od numeru current? Myślę, że może być po coś tak:

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

alternatywna struktura obiektu:

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

Myślałem, że obudowa zmiennej w funkcji była sposobem na uniknięcie globali –

+1

Deklarując zmienną w funkcji, która nie jest globalna, jest to poprawne. Jednak żywotność tej zmiennej jest aktywna tylko wtedy, gdy używana jest funkcja. Gdy funkcja istnieje, zmienna "już nie istnieje". Możesz zastanowić się nad obiektem :) – Richard

+0

Dziękuję Richard –