2011-12-15 10 views
1

Javascriptの名前空間に変数を渡す方法:は、私はそうのようなJavascriptの名前空間を作成している

MyApp.someFunction(x); 

は、私は次の操作を実行できるようにしたいと思います:

var MyApp = function() { 
     return { 
     someFunction : function(x) {} 
      alert(MyApp.y); 
     } 
}(); 

これは私がこれを行うことができます:

MyApp.y = "test"私someFunctionは、この変数Yをアクセスできるように

これを解決する方法のアイデア?私のNS構文をそのままにしておきたいので、私のサンプルコードでうまくいくソリューションがいいでしょう。

+0

あなたがエンクロージャにsomeFunctionを入れている任意の特定の理由はありますか?私が知る限り、その変数をそのエンクロージャに渡すことはできませんが、もちろんグローバル変数にアクセスすることもできます。エンクロージャを必要としない場合は、 'return'ブロックの代わりに' this.someFunction = function(x)... 'を実行することができます。また、あなたが 'MyApp'にそれを格納しているときに、その関数を' new'したいと思うかもしれません。 – Thor84no

答えて

2

あなたが説明した内容はうまくいくはずです。 (。あなたは構文エラーと未使用の引数xを持っている場合を除き)

var MyApp = function() { 
    return { 
    someFunction : function(x) { 
     alert(MyApp.y); 
    } 
    } 
}(); 
MyApp.y = 'test'; 
MyApp.someFunction() // alerts 'test' 

別のアプローチは、より多くのコンストラクタのようなあなたの外側の関数を扱い、クロージャとしてYを渡すことです:

var MyApp = (function (y) { 
    return { 
     y: y, 
     someFunction: function() { 
      alert(MyApp.y); // or alert(this.y) 
     } 
    } 
} ('test')); 
MyApp.someFunction(); // alerts 'test' 
+0

そうですね。私のコードで何かマイナーなことを忘れてしまったようです。ありがとう! – Jorre

2

私は行くだろうこのようなもので:

var MyApp = function() { 
    var _y = "default value"; 
    return { 
     someFunction: function(x) { 
      console.log(_y); 
     }, 
     setY: function (y) { 
      _y = y; 
     } 
    } 
}(); 

yに値を割り当てる前にMyApp.someFunction()を呼び出すことが安全であることを意味します。また、変数の内容が名前空間のスコープ内に保持されていることも意味します。

ここ
console.log(MyApp._y); // undefined 

はそれを使用する方法を次のようになります。

MyApp.someFunction(); // "default value" 
MyApp.setY("new value"); 
MyApp.someFunction(); // "new value" 
+0

「プライベート変数」を表すためにアンダースコアを使用する場合は+1 – KeatsKelleher

+0

@akelleheなぜですか? JavaScriptはPythonではありません。アンダースコアを使用すると、変数が 'for ... in'ループに現れたり、MyApp.hasOwnProperty( '_ y')'を実行したときに真にならないようになりません。 JavaScriptのプライベートメンバーはコンストラクタの変数に過ぎません。彼らはプライベートと特権のある方法でしかアクセスできません。 [参照](http://javascript.crockford.com/private.html)私はこのアプローチに反対していない、私はちょうどアンダースコアのポイントが表示されない、とOPは値がプライベートであることを求めていない。 – kojiro

+1

アンダースコアは、プライベート変数をはるかに読みやすくします。あなたがどこかでそれを見ると、その範囲がすぐに理解されます。クラス/インスタンスメソッドのローカル変数と区別するのはとても簡単です。 – KeatsKelleher

関連する問題