参照を変更するために電話したり申請したりすることに興味はありませんthis
。私自身の興味のために、私はJavaScriptの別のrequireテクニックのアイデアで遊んでいます.
関数で toString と eval を使用するサンプル ソリューション (単なる概念実証) がありますが、これを行うためのより安全で効率的な方法があるかどうか疑問に思っています。
// Sample module libraries (would probably be in their own files)
someModules = {
testModule: {test: function(){console.log("test from someModule")}},
anotherModule: { doStuff: function(){console.log("Doin stuffs!");}}
};
sampleRequire = function() {
// Load the modules
for (var i=arguments.length-2; i>=0; --i){
// Create a local variable reference to the module
eval ('var '+arguments[i]+' = someModules.'+arguments[i].toString());
}
// Redefine the programmer's function so that it has my local vars in its scope
eval("var fn = "+arguments[arguments.length-1]);
return fn;
}
// Main code...
sampleRequire( 'testModule', 'anotherModule',
function(){
testModule.test();
anotherModule.doStuff();
}
)();
編集:
Pointy は、これが main 関数のスコープを完全に破壊することになるという優れた点を指摘しましたが、これはしばしば受け入れられないものでした。理想的には、他のスコープ変数を壊すことなく、モジュール変数が関数のスコープに追加されるのを見たいと思います (モジュール名を除いて - プログラマーは 2 つのことに同じ名前を使用しないことを知っている必要があります)。これはおそらく不可能だと思いますが、それでもいくつかのアイデアを見たいと思っています.
もう 1 つの目標は、モジュールごとにメイン関数に引数を追加することなく、これを柔軟に行うことです。それ以外の場合は、CommonJS スタイルを使用して振り出しに戻ることになります (私はこれと戦おうとしているわけではありません。スコープに興味があるだけです!)。