сохранение переменной в функции javascript

Я хочу разместить переменную в функции Эта переменная изменяется в зависимости от взаимодействия с пользователем

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

когда док нагрузок я называю plan_state ("я");

когда происходят определенные вещи, я могу назвать plan_state ('loved')

проблема, я запускаю функцию и хочу проверить текущее состояние..

alert(plan_state());

Я получаю неопределенное назад и, по крайней мере, должен быть "я", когда я устанавливаю эту нагрузку.

что я делаю не так?

2 ответов


функция не является stateful, потому что переменная состояния объявлена внутри функции и, следовательно, существует только для времени жизни вызова функции. Простым решением было бы объявить переменную глобально, вне функции. Это плохо плохо плохо плохо.

лучший подход-использовать модуль pattern. Это важный шаблон для изучения, если вы серьезно относитесь к javascript развитие. Он включает состояние с помощью внутренних (частных переменных) и предоставляет ряд методов или функций для изменения или получения состояния (например, объектно-ориентированное программирование)

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

так stateModule.changeState("newstate"); состояние

и var theState = stateModule.getState(); получает государство


Я считаю, что область вашей переменной слишком "низкая"; определяя переменную внутри функции, либо как параметр, либо явно как var, Он доступен только внутри функции. Чтобы достичь того, что вам нужно, вы можете либо реализовать переменную вне области действия функции, на более глобальном уровне (не рекомендуется на самом деле).

однако, после перечитывания вашего вопроса, это немного промах. Вы бы не хотели вернуться state независимо от the current? Я думаю, вы могли бы быть после чего-то вроде этого:

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

альтернативная структура объекта:

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");