2016-04-25 4 views
4

ノードのグローバル変数にGLOBALオブジェクトのプロパティとしてアクセスできます。オブジェクトとしてNodeJSモジュールスコープ変数にアクセス

同様の方法でモジュールスコープ変数にアクセスできますか?

var fns_x = function(){/*...*/}; 
var fns_y = function(){/*...*/}; 

function aFn(param){ 
    /* moduleScope = something that allows me to access module scope variables */ 
    if(moduleScope['fns_' + param]){ 
     moduleScope['fns_' + param](); 
    } 
} 

/*...*/ 
module.exports = /*...*/ 

オブジェクトにこれらの変数をラップする方がよいでしょうか?例えば

var fns = { 
    x: x = function(){/*...*/}, 
    y: x = function(){/*...*/} 
} 

function aFn(param){ 
    if(fns[param]){ 
     fns[param](); 
    } 
} 

/*...*/ 
module.exports = /*...*/ 
+2

「fns」をエクスポートしないでください(2番目の例を少し修正してください)。私は、関数が宣言されているかどうかをチェックする関数の必要性は見当たりません。 – Andy

+0

ちょうど同じ問題が発生しました。ディレクトリを読み込み、そのファイルのすべてをモジュールスコープの変数として必要としますが、それらをラップしたくありません。 – Megakoresh

答えて

1

短い答えはNO です。

ECMAScript仕様では、モジュールの環境レコード設定で変数宣言を使用できますが、プログラムでアクセスできないように指定されています。

のECMAScriptプログラムは、直接そのような値にアクセスしたり、操作することが

[spec]

不可能な1つの回避策は、あなたの機能のためのコンテナとしてプライベート変数を維持し、検索機能を公開することです。

var registry = { 
    x: function() {}, 
    y: function() {}, 
}; 


module.exports = function (prop) { 
    return registry[prop]; 
}; 

モジュールコードの静的解析がこのように失われることに注意してください。

グローバル環境にバインドすることもできますが、モジュールのグローバルスコープに設定されている重要な変数を上書きする危険性があります。

var that = this; 

that.x = function() {}; 
that.y = function() {}; 

module.exports = function (prop) { 
    return that[prop]; 
}; 
関連する問題