1. ホーム
  2. javascript

[解決済み] NodeJSの'global'オブジェクトとは?

2023-05-22 09:58:44

質問

の挙動が変なんですが。 this キーワードの奇妙な挙動を発見しました。コードでリストアップしています。私はこのコードを NodeJS v6.x で、1つの JavaScript ファイルを作成します。

以下のような1行のコードでテストしている間、あるなしに関わらず 'use strict' ステートメントがあってもなくても、これは空のオブジェクトを指しています。 {} .

console.log(this)

しかし、このステートメントを自己実行関数の中で実行すると、次のようになります。

(function(){
  console.log(this);
}());

すごく大きなオブジェクトを出力していますね。で作成されたグローバル実行コンテキスト・オブジェクトが表示されているように見えます。 NodeJS 環境にあるようです。

また、上記の関数を実行する際に 'use strict' ステートメントで実行すると、予想通り undefined

(function(){
  'use strict';

  console.log(this);
}());

しかし、ブラウザで作業している間(私は Chrome でしかテストしていません)、最初の三つの例では window オブジェクトを生成し、最後のものは undefined を期待通りに返してくれました。

ブラウザの動作は非常に理解しやすいものです。しかし NodeJS の場合、関数の内部でラップするまでは実行コンテキストを作成しないのでしょうか?

で、ほとんどのコードは NodeJS のコードのほとんどは、空の グローバル object ?

どのように解決するのですか?

ブラウザでは、グローバルスコープが window オブジェクトですが、nodeJSではモジュールのグローバルスコープはモジュールそのものなので、nodeJSモジュールのグローバルスコープで変数を定義すると、そのモジュールのローカルになります。

このことについては NodeJSのドキュメント と書いてあるところ。

グローバル

<Object> The global namespace object.

ブラウザでは、最上位のスコープがグローバルスコープとなります。つまり ブラウザでは、グローバルスコープの var で何かがグローバル変数を定義します。 グローバル変数を定義します。Node.jsではこれは違います。トップレベルのスコープは Node.jsのモジュールの中にあるvar somethingは、そのモジュールのローカル変数になります。 はそのモジュールにローカルになります。

と書くと、あなたのコードでは

  • console.log(this) 空のjsファイル(モジュール)の場合、空のオブジェクトを表示します。 {} を表示します。
  • console.log(this); 自己起動型関数の内部で this はグローバルな nodeJS スコープオブジェクトを指します。 require() , module , exports , console ...
  • console.log(this) ストリクトモード 自己呼び出し関数の内部では、次のように表示されます。 undefined のデフォルトローカルスコープオブジェクトを持たないためです。 厳密モード .