javascript函数中保持变量活动的问题

javascript函数中保持变量活动的问题,javascript,function,variables,call,Javascript,Function,Variables,Call,我想在函数中包含一个变量。此变量将根据用户交互更改状态。例如: function plan_state(current){ if (current != ''){ state = current; } else { return state; } } 当文档加载时,我调用plan\u state('me'),当某些事情发生时,我可以调用plan\u state('loved')。当我运行函数并希望检查当前状态时,会出现问题: al

我想在函数中包含一个变量。此变量将根据用户交互更改状态。例如:

function plan_state(current){
    if (current != ''){
        state = current;
    }
    else {
        return state;
    }
}
当文档加载时,我调用
plan\u state('me')
,当某些事情发生时,我可以调用
plan\u state('loved')
。当我运行函数并希望检查当前状态时,会出现问题:

alert(plan_state());
我返回了
未定义的
,但该值应为“me”,因为我以前在文档加载时设置了该值


我做错了什么?

我认为变量的范围太小了;通过在函数中定义变量(作为参数或显式定义为
var
),它只能在函数中访问。为了实现您所追求的目标,您可以在函数范围之外以更全局的级别实现变量(实际上不推荐)

然而,在重读了你的问题之后,有点错过了引导。您是否不想返回
状态
,而不考虑当前的
状态
?我想你可能想要这样的东西:

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

函数不是有状态的,因为状态变量是在函数内部声明的,因此只在函数调用的生存期内存在。一个简单的解决方案是在函数外部全局声明变量。这是

更好的方法是使用。如果您认真对待javascript开发,这是一个必须学习的模式。它通过内部(私有变量)启用状态,并公开了许多用于更改或获取状态的方法或函数(如面向对象编程)

所以
stateModule.changeState(“newstate”)设置状态


var theState=stateModule.getState()
获取状态

我认为通过将变量包含在函数中是一种避免全局的方法,在函数中声明一个变量它不是全局的,这是正确的。但是,该变量的寿命仅在使用该函数时有效。当函数存在时,变量“不再存在”。您可能想考虑一个对象:它是通过将函数设置为“me”在函数OnLoad中声明的吗?这很好。我想这是我想要的,尽管我并不完全理解。。然而我接受它作为答案,因为我避免了全局变量问题。谢谢,真管用!!在实现它并使用它之后,我有点理解它。。顺便说一句,我不得不把ChangeState换成ChangeState。。或者反之亦然。很高兴这有帮助。使用这种模式,你很快就会成为JavaScript忍者!我修复了函数调用案例错误thx,指出了它;比如编辑:现在我想起来了,为什么你需要所有这些,而不仅仅是一个
state
变量……就这样?他正在学习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
    }());