2011-10-25 9 views
1

私はJavaScriptプログラミングの初心者です。私は実際にヘルプ/アドバイスが必要です。私がやろうとしています何javascriptクロージャー関数で変数を保持する

: 私は関数(またはオブジェクトを?!)が次のようになります。

var svgInteraction = function (containerId) { 
    var svgNamespace = "http://www.w3.org/2000/svg", 
     htmlns = "http://www.w3.org/1999/xhtml", 
    mathns = "http://www.w3.org/1998/Math/MathML"; 

    svgInteractions = {}; 

    svgInteractions[containerId] = "I am " + containerId; 
    console.log(svgInteractions); 

    return function() { 
     console.log(svgInteractions); 
    } 
}; 

私はこのような変数の初期化:

var svg1 = svgInteraction("container_1"); 
var svg2 = svgInteraction("container_2"); 

問題をつまり、svgInteractionの初期化ごとに、svgInteractionsオブジェクトが再初期化されます。

これは、出力:

Object { container_1="I am container_1"} 
Object { container_2="I am container_2"} 

は、その中に古い値を維持する方法はありますか?

は、関数が呼び出される(svgInteractions = {})空のオブジェクトにするたびにそれを設定しないでください、あなたに

答えて

1

ありがとうございます。

これを試してみてください

...ここ
var svgInteraction = (function() { 

    var svgInteractions = {}; 

    return function(containerId) { 
    // Implementation 
    } 

})(); 

は、 svgInteractionsがカプセル化されているが、それはまた svgInteractionへのすべての呼び出しのための 静的になります。

+0

私はその閉鎖のトリックを考えていませんでした。ニース! –

+0

ありがとうございます。 すべての実装コードはreturn関数の内部にあるべきですか?それはinit()のようなものですか? 別の質問: 初期化ごとに独立変数/関数を保持するにはどうすればよいですか?たとえば、コンテナによって異なる「クリック」機能が実行されるようにしたいとします。 私は何かについて考えていた 'svgInteractions [containerId] .clickfunction = function(){...}' –

+0

@GavanCatalinうん、あなたは正しい。呼び出しごとに初期化したいものはすべて関数本体に入れる必要があります。 – alex

関連する問題