3

JavaScriptでプライベートグローバル変数を作成する方法はありますか?私は周りを見回してみましたが、コンストラクターの話にぶつかり続けています-これはあまりグローバルではないようです。

ありがとう

4

3 に答える 3

4

ユースケースが何かわからない。いくつかの関数と変数を含む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
于 2012-05-12T16:17:51.900 に答える
1

あなたの質問に答えるために、いいえ、javascriptにはアクセス修飾子がないのでそれは不可能です。グローバルスコープで宣言された変数は、どの関数からもアクセスできます。

この回答へのコメントで指摘されているように、プライベートメンバーを持つオブジェクトを作成できます。Crockfordには、 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、secret、およびこれらはすべて、外部からアクセスできないという点でプライベートです。より明確にするために、これらの変数は特権メソッドまたはプライベートメソッドによってのみアクセスできます。違いは、特権メソッドはオブジェクトの任意のインスタンスから呼び出すことができるということです。コメントで示唆されているように、これはクロージャーを使用することで達成できます。

閉鎖についての簡単な説明についてはCrockfordから引用していますが、関連する質問がたくさんあります。

これが意味するのは、外部関数が戻った後でも、内部関数は常にその外部関数の変数とパラメーターにアクセスできるということです。

于 2012-05-12T15:28:27.270 に答える
0

プライベートメンバーを持つために。クロージャを使用する必要があります。

次のコードは、概念を理解するのに役立ちます。

function CustomArray () {
    this.array = [];

    var privateData = 'default data';
    this.getPrivateData = function () {
        return privateData;
    };
    this.setPrivateData = function (data) {
        privateData = data;
    }; 
};

CustomArray.prototype.push = function (data) {
    this.array.push(data);
};

CustomArray.prototype.unshift = function (data) {
    this.array.unshift(data);
};

CustomArray.prototype.pop = function () {
    this.array.pop();
};

CustomArray.prototype.shift = function () {
    this.array.shift();
};

CustomArray.prototype.print = function () {
    console.log(this.array.join(','));
};

var array = new CustomArray();

array.push(10);
array.push(20);
array.push(30);
array.push(5);

array.unshift(3);
array.unshift(2);
array.unshift(1);
array.unshift(0);

array.pop();
array.shift();

array.print();
console.log(array.getPrivateData());// default data 
array.setPrivateData('am new private data');
console.log(array.getPrivateData());//am new private data
于 2018-05-26T18:55:43.197 に答える