3

私はノードで、すべてのモジュールがローカルスコープを取得し、1 つのモジュール内で定義された変数が明示的にエクスポートされない限りグローバルにエスケープされないことを知っています。

私が知りたいのは、次のように 1 つのモジュール ファイルで変数を宣言するときです。この変数が定義されているグローバル オブジェクトは何ですか?

var obj = {};
// In browser, this is defined on window.obj
// How about in the node?

ローカル グローバル スコープとして使用されるオブジェクトであるステートメントが 1 つありますが、次のテスト コードは失敗します。global

a = 1
console.log global.a
// undefined

では、モジュールのグローバル変数とは何でしょう?

4

2 に答える 2

1

実際、ノードにはグローバル オブジェクトがあります。単に と呼ばれglobalます。プロパティを割り当てて、他のオブジェクトと同じようにそれらのプロパティにアクセスでき、モジュール間で実行できます。global.foo=barただし、(あるモジュールでbaz=global.foo、別のモジュールで)直接アクセスすることが、それにアクセスする唯一の方法です。修飾されていない変数名は、たとえば、ブラウザー環境で修飾されていない変数名が に解決されるように、そのプロパティに自動的に解決されることはありませんwindow.somethingOrOther。ノードでは、すべてのモジュールが概念的に即時関数呼び出し内にラップされるため、非修飾名はローカル変数を表し、モジュール レベルのスコープを持ちます。

于 2012-07-01T00:57:32.553 に答える
0

もう一度編集Node モジュールでは、グローバル オブジェクトへの参照を取得できないと結論付けようとしています。本当に必要はありません。それがモジュールメカニズムの要点のようなものだと思います。必要なものをインポートし、選択したものをエクスポートします。

Node にグローバル オブジェクトがあるかどうかは、興味深い質問だと思います。Rhinoには間違いなくあることを私は知っています。Java コンテナから Rhino に供給されるコードの周りに暗黙的なラッパー関数はありません。Java ScriptEngine メカニズム (およびおそらく「裸の」Rhino の Mozilla API から) を介して、シンボルをグローバル コンテキストにプッシュし、グローバル オブジェクト プロパティとして JavaScript に表示できるようにする方法があります。

うわー、これは複雑になりました。Node.js の世界では物事が動き出しているようです。上に書いたことは Node 0.6.2 にも当てはまりましたが、0.9.0 プレ ビルドでは、「global」と呼ばれるオブジェクトが実際に存在し、多かれ少なかれブラウザーのグローバル オブジェクトのように動作します。


以下のものは、ブラウザとRhino、およびそのような他のコンテキストに適用されます

thisグローバルコンテキストで使用できます。名前が必要な場合は、名前を付けることができます。

var global = this;

var obj = "Hi!";

global.obj = "Bye"; // sets "obj"

(やや) 一般的なイディオムは、コードを関数でラップして、グローバル名前空間を保護することです。

(function( global ) {
  // everything
})( this );

警告:私は Node の人ではないので、その文化には新しいイディオムがあるかもしれません。

編集— ノードが関数で評価するファイルから実際にコードをラップし、それがグローバルコンテキストから渡されないthis場合、それを「見つける」方法はないと思います。「use strict」を使用する場合 (使用する必要があります)、それは問題ではありません。とにかく、グローバル コンテキストを実際に台無しにすることはできないからです。

于 2012-06-30T17:53:48.703 に答える