3

Node.jsで次の問題が発生していますv0.10.1(簡単な例で示されています)。

インタラクティブコマンドラインでノードを実行しているとき:

> global.require
{ [Function: require] . . . }
> require
{ [Function: require] . . . }

以下を実行するscript.jsと、予期しない結果が発生します。

console.log(global.require);     // 1.
console.log(require);            // 2.
undefined                        // 1. `global.require` is undefined!
{ [Function: require] . . .}     // 2. `require` by itself works however.

で示される余分なコードを削除しました...。ローカルで実行して、実際に表示される内容の全範囲を確認します。

これが起こる原因は何ですか?

4

2 に答える 2

2

Node.jsには、独自のRead-Evaluate-Print-Loopsを作成できるreplreplモジュールが含まれています(これが略です)。このモジュールを使用すると、新しいreplを作成するために使用する関数startがあります。

この関数は、options replを構成できるオブジェクトを取ります。これらのオプションの1つはと呼ばれuseGlobalます。このオプションのドキュメントによると、次の文が有効です。

に設定するtrueと、replはglobal別のコンテキストでスクリプトを実行する代わりに、オブジェクトを使用します。デフォルトはfalse

Node.jsをインタラクティブモードで起動すると、これは基本的に、replモジュールを使用して自分で作成できるようなreplにすぎません。useGlobalNode.jsのデフォルトのreplがに設定されていると思います(これは単なる推測であることに注意してください!)true

したがって、globalオブジェクトがあり、それはとにかくグローバル名前空間とまったく同じです。requireしたがって、グローバル名前空間で見つけることができるようなすべての関数は、globalオブジェクトで再び見つけることができます。

Node.jsアプリケーションを非対話型モードで起動すると、replがないため、globalオブジェクトはありません。

それはあなたにとって意味がありますか?

于 2013-03-26T19:11:03.460 に答える
2

グローバルの多くは、通常、グローバルスコープまたはglobalオブジェクトのメンバーには含まれません。

これらのオブジェクトは、すべてのモジュールで使用できます。これらのオブジェクトの一部は、実際にはグローバルスコープではなく、モジュールスコープにあります。これは注記されています。

これらは、2番目の解釈による「グローバル」です。

  • 最上位のスコープ。
  • 現在のローカルスコープ以外のアクセス可能なスコープの。

また、次の点についても説明しrequire()ます。

モジュールを要求するため。モジュールのセクションを参照してください。require実際にはグローバルではなく、各モジュールに対してローカルです。

インタラクティブモードを管理するREPLモジュールには、それらをグローバルスコープにプロモートするオプションがあります。

useGlobal--に設定するtrueと、replはglobal別のコンテキストでスクリプトを実行する代わりに、オブジェクトを使用します。デフォルトはfalse

于 2013-03-26T19:11:36.127 に答える