Pytanie w sprawie function, call, variables, javascript – utrzymywanie zmiennej przy życiu w funkcji javascript

14

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

<code>function plan_state(current){
    if (current != ''){
     state = current;
    }
    else {
     return state;
    }
}
</code>

kiedy doc ładuje, wywołuję plan_state („ja”);

kiedy pewne rzeczy się zdarzają, mogę zadzwonić na plan_state

problem, uruchamiam funkcję i chcę sprawdzić bieżący stan ..

<code>alert(plan_state());
</code>

wracam niezdefiniowany i przynajmniej powinienem być „ja”, ponieważ ustawiam ten onload.

Co ja robię źle?

czy jest zadeklarowany w funkcji onload przez ustawienie go na „ja”? Daniel Hunter
gdzie deklarujesz stan? Loktar

Twoja odpowiedź

2   odpowiedź
1

definiując zmienną w funkcji, jako parametr lub jawnie jako avar, jest dostępny tylko w ramach funkcji. Aby osiągnąć to, czego szukasz, możesz albo zaimplementować zmienną poza zakresem funkcji, na bardziej globalnym poziomie (nie jest to zalecane).

Jednak po ponownym przeczytaniu pytania jest ono nieco słabo prowadzące. Czy nie chcesz wrócićstate niezależnie odcurrent? Myślę, że możesz być po czymś takim:

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

Alternatywna struktura obiektu:

<code>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");
</code>
Deklarowanie zmiennej w funkcji nie jest globalne, to prawda. Jednak żywotność tej zmiennej jest aktywna tylko wtedy, gdy funkcja jest używana. Gdy funkcja istnieje, zmienna „już nie istnieje”. Możesz rozważyć obiekt :) Richard
Dziękuję Richard Daniel Hunter
Pomyślałem, że umieszczenie zmiennej w funkcji to sposób na uniknięcie globali Daniel Hunter
44

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

Lepszym rozwiązaniem jest użyciewzór modułu. Jest to niezbędny wzorzec do nauczenia się, jeśli poważnie myślisz o rozwoju javascript. Włącza stan za pomocą wewnętrznych (zmiennych prywatnych) i udostępnia wiele metod lub funkcji do zmiany lub uzyskania stanu (jak programowanie obiektowe)

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

więcstateModule.changeState("newstate"); ustawia stan

ivar theState = stateModule.getState(); dostaje stan

Prace!! i po zaimplementowaniu go i zabawie z nim rozumiem to. Musiałem zmienić ChangeState, aby zmienić stan przy okazji ... lub odwrotnie. Daniel Hunter
Jaka jest różnica stanu owijania w funkcji i ujawnianie funkcji wewnętrznych, które mutują ten stan w porównaniu z posiadaniem tych funkcji w module ES6 i zmiennych globalnych niech na górze modułu ES6, a następnie eksportowanie funkcji, które mogą manipulować stanem lokalnej zmiennej? PositiveGuy
Ale czy moduł StateModule nie jest teraz również globalny? Więc gdzie jest dokładnie ta różnica, niż użycie tylko ciągu var stanModuł i po prostu przypisać mu jakąś wartość? kaiser
Cieszę się, że to pomogło. Korzystając z tego wzoru, będziesz szybkim ninja JavaScript! Naprawiłem błąd case wywołania funkcji thx dla wskazania go. reach4thelasers

Powiązane pytania