2012-05-04 8 views
12

javascript関数の中で生き変数保ちます。は、私はドキュメントのロードは、私が(「私」)plan_stateを呼び出したときに、この変数は、ユーザーとの対話</p> <pre><code>function plan_state(current){ if (current != ''){ state = current; } else { return state; } } </code></pre> <p>に応じて状態を変更する関数 で変数を収容したい

特定の物事は私が(「愛し」)plan_stateを呼び出すことが起こる

問題、私は関数を実行し、現在の状態を確認したい。..

alert(plan_state()); 

私は未定義の背中とで取得私はこのオンロードを設定するので、少なくとも私は '私'でなければなりません。

何が間違っていますか?

+2

あなたは州を宣言していますか? – Loktar

+0

それは 'me'に設定することでonload関数で宣言されていますか? –

答えて

33

機能がステートフルされていない私はあなたが何かの後にそうかもしれないと思います関数呼び出しの簡単な解決策は、関数の外で変数をグローバルに宣言することです。これは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();が取得セット状態

+0

これは素晴らしいです。私はこれが私が探しているものの多くであり、私はそれを完全に理解していないにもかかわらずだと思います...しかし...私はグローバル変数の問題を避けていたので答えとして受け入れています。ありがとう。 –

+0

作品!それを実装して遊んだ後、私はそれを理解しています。途中でChangeStateをchangeStateに変更しなければなりません。 –

+0

助けてくれてうれしいです。このパターンを使用すると、すぐにJavaScriptの忍者になります!私は、それを指摘するために関数呼び出しのcaseエラーthxを修正しました。 – reach4thelasers

1

私はあなたの変数の範囲があまりにも低いと考えています。ファンクション内の変数をパラメータとして定義するか、または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"); 
+0

私は、変数を変数に格納することによって、グローバルを避ける方法であると考えた –

+1

関数内で変数を宣言することによって、グローバルではないことが正しいです。しかし、その変数の存続期間は関数が使用されている間のみ有効です。関数が存在する場合、変数は「存在しません」。あなたはオブジェクトを考慮する必要があります:) – Richard

+0

ありがとうリチャード –

関連する問題

 関連する問題