Node.jsで、module-scopeに次のようなコードを含むモジュールをロードすると、次のようになります。
this["foo"] = function() { console.log("foo"); }
...次にfoo()
、モジュールを使用して任意のコードから言うだけで呼び出すことができる、グローバルに利用可能な関数を取得しているように見えます。が付いた印刷物の1つとして見ることができますObject.getOwnPropertyNames(this)
。
ただし、代わりに次をモジュールスコープに入れると:
function foo() { console.log("foo"); }
...次に、そのモジュール内で同様に呼び出すことができる関数を生成しますが、モジュールfoo()
の外部では表示されません(たとえば、の項目の1つとして表示されませんObject.getOwnPropertyNames(this)
)。
これは、ブラウザで行われていることからの実行時の動作の変更であると私は収集します。ブラウザはデフォルトですべてをグローバルスコープに突っ込んでいるようです(そして何年もの間、人々は無名関数などで物事をまとめることによってこれを意識的に回避しなければなりませんでした)
私の質問は、NodeJが、を使用してBESIDESexports.(...) = (...)
と宣言されているモジュールの外部でこれらの宣言と対話するための秘密の方法を持っているかどうかです。それらは何らかの方法で列挙できますか、それともモジュールエクスポートによって呼び出されない場合、宣言されるとすぐにガベージコレクションされますか?モジュールをロードする前に、そのような関数の名前がどうなるかを知っていた場合、定義されたときにNode.jsに「キャプチャ」するように指示できますか?
そのような機能が十分に文書化されているとは思っていません...しかし、おそらくデバッガー機能または他のシステムコールがあります。最良のポインタの1つは、この種の宣言が処理されるNode.jsプロジェクトの特定のコードを参照して、抜け穴があるかどうかを確認することです。
注:V8を少し調べてみると、「関数定義」がコンテキストに追加されていないことがわかりました。「実行コンテキスト」の「アクティベーションオブジェクト」に入れられ、プログラムでアクセスすることはできません。あなたが私が見つけたいくつかの「軽い読書」が必要な場合: