【问题标题】:Problem keeping variable alive in a javascript function在javascript函数中保持变量活动的问题
【发布时间】:2012-05-14 05:18:08
【问题描述】:

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

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

加载文档时,我调用plan_state('me'),当某些事情发生时,我可能会调用plan_state('loved')。当我运行一个函数并想检查当前状态时会出现问题:

alert(plan_state());

我得到了undefined,但值应该是“我”,因为我之前在文档加载时设置了这个值。

我做错了什么?

【问题讨论】:

  • 是否在函数onload中声明为'me'?

标签: javascript function variables call


【解决方案1】:

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

更好的方法是使用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(); 获取状态

【讨论】:

  • 这很棒。我认为这更多的是我正在寻找的东西,即使我不完全理解它.. 然而......我接受它作为答案,因为我正在避免全局变量问题。谢谢。
  • 有效!!在实现它并使用它之后,我有点理解它.. 不得不顺便将 ChangeState 更改为 changeState.. 或反之亦然。
  • 很高兴它有帮助。使用该模式,您很快就会成为 JavaScript 忍者!我修复了函数调用案例错误 thx 以指出它。
  • 您可以完全跳过该对象,让 API 保持不变; this 之类的东西 编辑:现在我想一想,为什么你需要这一切,而不是仅仅拥有一个 state 变量......就是这样?
  • 他正在学习 JavaScript/编程和错综复杂的范围。除了成为一个糟糕的开发人员之外,他还能从使用全局变量中学到什么/获得什么?您的示例会起作用,但不会帮助他理解模块模式。我们都是来学习的,对吧?
【解决方案2】:

我认为您的变量范围太“低”;通过在函数内定义变量,无论是作为参数还是明确地作为var,它只能在函数内访问。为了实现你所追求的,你可以在函数范围之外,在更全局的层次上实现变量(真的不推荐)。

但是,在重新阅读您的问题后,它有点误导。不管current如何,您都不想返回state吗?我想你可能会追求这样的东西:

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

【讨论】:

  • 我认为将变量包含在函数中是一种避免全局变量的方法
  • 通过在函数中声明一个变量,它不是全局的,这是正确的。但是,该变量的生命周期仅在使用该函数时才有效。当函数存在时,变量“不再存在”。您可能需要考虑一个对象:)
猜你喜欢
  • 2012-11-12
  • 2017-06-27
  • 2014-07-18
  • 2022-01-17
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 1970-01-01
相关资源
最近更新 更多