web-dev-qa-db-ja.com

Node.js変数の宣言とスコープ

Node.jsでこれを入力すると、undefinedが返されます。

var testContext = 15;
function testFunction() {
  console.log(this.testContext);
}
testFunction();
=>undefined

varキーワードがなければ、合格します(=> 15)。 Chromeコンソール(varキーワードありとなし)で動作しています。

36
IGRACH

var現在のモジュールのローカルであるため、testContextを使用する場合、Nodeでは機能しません。直接:console.log(testContext);

varと入力しないと、testContextNodeプロセス全体のグローバル変数になります。

Chrome(または他のブラウザ-まあ、oldIEについてはよくわかりません...)で、あなたの例でvarを使用してもしなくても構いません。 testContextグローバルコンテキストに移動します、つまりwindowです。

ところで、「グローバルコンテキスト」は、JSの関数呼び出しのデフォルトthisです。

48
gustavohenke

主な違いは、Node.jsのすべてのモジュール(スクリプトファイル)が独自に実行されることです closure while Chromeおよび他のブラウザーはグローバル内ですべてのスクリプトファイルを直接実行します範囲。

これは Globals documentation で言及されています:

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

Nodeモジュールで宣言するvarsはこれらのクロージャーの1つに分離されます。そのため、他のモジュールでは export members が必要です。それらに到達します。

ただし、特定のコンテキストなしでfunctionを呼び出す場合、通常はglobal objectにデフォルト設定されます-これは便利に呼び出されます- global ノード内。

function testFunction() {
    return this;
}

console.log(testFunction() === global); // true

そして、それを宣言するvarがなければ、testContextはデフォルトで グローバルとして定義 になります。

testContext = 15;
console.log(global.testContext); // 15
17

document で述べたように

node.jsモジュール内のvar somethingは、そのモジュールに対してローカルになります。

そのため、var testContextはモジュールコンテキストにあり、このコンテキストはglobalです。

または、次を使用できます。

global.testContext = 15;
function testFunction() {
  console.log(this.testContext);
}
testFunction();
4
prasun

問題はthisキーワードに関係していると思います。 console.log(this)を実行すると、testContextが定義されていないことがわかります。あなたが試してみたいことがあります:

this.testContext = 15;
function testFunction() {
  console.log(this.testContext);
}
testFunction();
0
Jason