2012-05-12 4 views
0

JavaScriptでプライベートグローバル変数を作成する方法はありますか?私は周りを見回してみましたが、私はあまりにもグローバルに見えないコンストラクタの話にぶち当たっています。ジャバスクリプトにはアクセス修飾子が存在しないとして、あなたの質問に答えるためにJavaScriptでグローバルプライベート変数を作成する方法は?

おかげ

+7

"プライベートグローバル変数"とはどういう意味ですか?例を教えてください。 –

+2

「グローバル変数ではない」と言えますか? – Joseph

+0

すぐに機能について読むことができます:http://stackoverflow.com/questions/8475578/what-is-the-reason-for-this-javascript-immediate-invocation-pattern –

答えて

2

ご使用のケースが不明です。いくつかの関数と変数を含むjsスクリプトファイルがあると仮定し、それらの一部をグローバルに公開したいが、残りの部分はスクリプトファイルに保存しておくと仮定します。あなたはクロージャーでこれを達成することができます。基本的には、すぐに実行する関数を作成します。関数の内部では、元のコードを配置します。次に、必要な機能をグローバルスコープにエクスポートします。

// Define a function, evaluate it inside of parenthesis 
// and execute immediately. 
(function(export) { 

    var myPrivateVariable = 10; 

    function myPrivateFunction(param) { 
    return param + myPrivateVariable; 
    } 

    export.myGlobalFunction = function(someNumber) { 
     return myPrivateFunction(someNumber); 
    }; 
})(this); // The *this* keyword points to *window* which 
      // is *the* global scope (global object) in a web browser 
      // Here it is a parameter - the *export* variable inside the function. 

// This is executed in the global scope 
myGlobalFunction(2); // yields 12 (i.e. 2 + 10) 
myPrivateVariable; // Error, doesn't exist in the global scope 
myPrivateFunction(2) // Error, doesn't exist in the global scope 
1

は、いや、それは不可能です。グローバルスコープで宣言された変数は、どの関数からもアクセス可能です。

この回答のコメントで指摘したように、プライベートメンバーを持つオブジェクトを作成できます。クロフトフォードにはprivate members in Javascriptというページがあります。上記の例では

function Container(param) { 

    // private method 
    function dec() { 
     if (secret > 0) { 
      secret -= 1; 
      return true; 
     } else { 
      return false; 
     } 
    } 

    this.member = param; 
    var secret = 3; 
    var that = this; 

    // privileged method 
    this.service = function() { 
     return dec() ? that.member : null; 
    }; 
} 

、PARAM、秘密、そしてその彼らが外部からアクセスされないという点で、すべてprivate:彼は彼のポイントを説明するために、次のコードを使用しています。より明確にするために、これらの変数は特権メソッドまたはプライベートメソッドによってのみアクセスできます。違いは特権メソッドはオブジェクトの任意のインスタンスから呼び出すことができることです。コメントに示唆されているように、これはクロージャを使用することで実現できます。

閉鎖の簡単な説明についてはCrockfordから引用しますが、related questionsをたくさん見つけることができます。これが何を意味するのか

は、内側の関数は常に外 関数が戻った後でも、 VARSとその外側の関数のパラメータへのアクセスを持っていることです。

+1

...本質的に[private via closure](http://phrogz.net/js/Classes/OOPinJS.html)という変数を作成できる点を除いて、 – Phrogz

+1

@Phrogzこれはもちろん可能ですが、プライベート値を含む実際の変数をグローバルスコープに含めることはできません。 – Radu

+0

修正;私は元の答えの最初の文にのみコメントしていました。 :) – Phrogz