1

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を少し調べてみると、「関数定義」がコンテキストに追加されていないことがわかりました。「実行コンテキスト」の「アクティベーションオブジェクト」に入れられ、プログラムでアクセスすることはできません。あなたが私が見つけたいくつかの「軽い読書」が必要な場合:

http://coachwei.sys-con.com/node/676031/mobile

http://perfectionkills.com/understanding-delete/

4

2 に答える 2

2

exports.foo=foo;と入力した場合 ファイル名を使用してvarmyFile= require('myFile.js')を実行し、myFile.foo();を介して関数を呼び出すと仮定すると、ファイルの最後でノード内の他のファイルで使用できるようになります。エクスポートで外部で使用するために関数の名前を変更したり、requireを使用するときにパッケージを呼び出したいものを設定したりすることもできます。

ところで、これらの関数は、JSONオブジェクトの場合と同じように列挙できます(つまり、k in ...)

于 2012-04-25T15:37:19.273 に答える
1

これは、デバッガーのようなより高度なリフレクションツールがなければノードでは不可能です。

これを行う唯一の方法は__parent__、セキュリティの問題やその他の理由で削除されたものを使用することです(最適化が難しく、最初から標準ではありません)。スクリプトを実行すると、これらの変数はモジュールの下で閉じられます。明示的にエクスポートせずに他の場所にアクセスすることはできません。

これはバグではなく、仕様によるものです。それがノードの仕組みです。この密接に関連する質問を参照してください

この種のリフレクションがデバッガーのようなツールなしで利用可能であった場合、ソースコードを最適化することは非常に困難でした(少なくともv8の動作方法)。つまり、あなたの質問に対する答えはノーです。ごめん。

于 2013-04-01T10:11:47.860 に答える