我想在函数中存放一个变量 此变量将根据用户交互更改状态
function plan_state(current){
if (current != ''){
state = current;
}
else {
return state;
}
}
当doc加载时我调用plan_state('me');
当某些事情发生时,我可以打电话给plan_state('喜欢')
问题,我运行一个函数,想要检查当前状态..
alert(plan_state());
我得到了未定义的,至少应该是'我',因为我设置了这个onload。
我做错了什么?
答案 0 :(得分:45)
该函数不具有状态,因为状态变量在函数内声明,因此仅在函数调用的生命周期内存在。一个简单的解决方案是在函数外部全局声明变量。这是bad bad bad bad。
更好的方法是使用module 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();
获得状态
答案 1 :(得分:1)
我相信你变量的范围太“低”;通过在函数中定义变量,无论是作为参数还是显式地定义为var
,它只能在函数内访问。为了实现你所追求的目标,你可以在函数范围之外实现变量,在更全局的范围内实现(不是真的推荐)。
然而,在重新阅读你的问题之后,它略显领先。不管state
,您都不想退回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");