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