17

関数に変数を格納したい。この変数は、ユーザーの操作に応じて状態を変更します。例えば:

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

ドキュメントが読み込まれたときに電話をかけplan_state('me')、特定のことが起こったときに電話をかけることがありますplan_state('loved')。この問題は、関数を実行して現在の状態を確認したいときに発生します。

alert(plan_state());

戻ってundefinedきましたが、以前にドキュメントの読み込み時にこの値を設定したため、値は「me」である必要があります。

私は何が間違っているのですか?

4

2 に答える 2

55

状態変数は関数内で宣言されているため、関数はステートフルではありません。したがって、関数呼び出しの存続期間中のみ存在します。簡単な解決策は、関数の外部で変数をグローバルに宣言することです。これは悪い 悪い 悪い 悪いです。

より良いアプローチは、モジュールパターンを使用することです。これは、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();取得します

于 2012-05-04T16:34:57.303 に答える
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");
于 2012-05-04T16:29:19.310 に答える