utrzymanie zmiennej przy życiu w funkcji javascript

Chcę umieścić zmienną w funkcji Ta zmienna zmieni stan w zależności od interakcji użytkownika

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

Kiedy doc ładuje wywołuję plan_state('me');

Kiedy pewne rzeczy się wydarzą, mogę nazwać plan_state ('kochany')

Problem, uruchamiam funkcję i chcę sprawdzić aktualny stan..

alert(plan_state());

Dostaję undefined z powrotem i co najmniej powinno być "ja", jak to ustawiam.

Co robię źle?
Author: Daniel Hunter, 2012-05-04

2 answers

Funkcja nie jest stanowa, ponieważ zmienna stanowa jest zadeklarowana wewnątrz funkcji i dlatego istnieje tylko przez cały czas trwania wywołania funkcji. Łatwym rozwiązaniem byłoby zadeklarowanie zmiennej globalnie, poza funkcją. To jest złe bad bad bad .

Lepszym podejściem jest użycie wzoru modułu . Jest to niezbędny wzorzec, aby dowiedzieć się, jeśli poważnie myślisz o rozwoju javascript. Umożliwia stan za pomocą w przeciwieństwie do innych metod, które nie są w stanie odczytać stanu, nie są w stanie odczytać stanu.]}

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

Więc stateModule.changeState("newstate"); ustawia stan

I var theState = stateModule.getState(); otrzymuje stan

 38
Author: reach4thelasers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:44

Uważam, że zakres zmiennej jest zbyt "niski"; definiując zmienną w funkcji, jako parametr lub jawnie jako var, jest ona dostępna tylko w funkcji. Aby osiągnąć to, czego szukasz, możesz albo zaimplementować zmienną poza zakresem funkcji, na bardziej globalnym evelu(naprawdę nie zaleca się).

[5]}jednak po ponownym przeczytaniu Twojego pytania, jest ono nieco chybione. Czy nie chciałbyś wrócić state niezależnie od current? I myślę, że możesz być po coś takiego:
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");
 1
Author: Richard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-04 16:41:09