2016-08-11 12 views
0

nodejsは、JSファイルを実行する際に、グローバルスコープで関数を呼び出すときに、このように、コンテキストをモジュールにthisに結合するであろうことを言われています:ない 『10』私は予想通り、nodejsグローバル変数は "module"関数にバインドされますか?

function father(){ 
    this.id=10 
} 
father(); 
console.log(module.id); 

また、実際にプリント「」 。モジュールが訪問するキーワードがある場合は、私はこれを試してみました:

(function (exports, require, module, __filename, __dirname) { 
    father(); 
    console.log(module.id); 
})() 

しかし、今回は、それはconsole.log(module.id)の行で例外をスローし、最後に

"TypeError: Cannot read property 'id' of undefined.

を言って、私はこれを試してみました:

console.log(this===module); 
console.log(this===global); 
function f1(){console.log(this===module);} 
function f2(){console.log(this===global);} 

function g1(){ 
    return function(){console.log(this===module);}; 
} 
function g2(){ 
    return function(){console.log(this===global);}; 
} 
f1(); 
f2(); 
g1()(); 
g2()(); 

まあそれは印刷します。

false 
false 
false 
true 
false 
true 

第1の回答と同じではありません。だから私はjsファイルの中で "node"キーワードをどのように使ってNodejsが実行できるのでしょうか?

そして最後に試してみてください。

function h(){this.a='abc';} 
h() 
console.log(module.exports.a); 

私は "ABC" を印刷することを期待するが、それでもそれは "未定義"

感謝を印刷します。

+0

それはまったく意味がありません。もし何も渡さなければ、 'module'パラメータは明らかに' undefined'です。 – Bergi

答えて

1

It's said that nodejs, when executing a js file, will bind "this" to module context

はいNo、それがexportsにバインドされています。ファイル内に

console.log(this === module.exports); // or just `exports` 

と入力すると、trueと記録されます。モジュールスコープで

when calling function with global scope

this値は、関数やそれらがどのように呼ばれているとは何の関係もありません。汚いモードでは、明示的に呼び出される関数のthisの値はグローバルオブジェクトになりますが、これはmoduleオブジェクトと同じではありません。

function father() { 
    console.log(this === global); 
} 
father(); // true 
+0

まだ動作していないようです。 console.log(これは===モジュール);私のテストでは「偽」を表示します。 – Troskyvs

+0

おっと、私はあなたが読んだことが正しいと思った。正確に言われたのはどこですか?私の更新を参照してください。 – Bergi

+0

私はあなたが提案何試み、それでも[\t関数h(){this.a = 'ABC';} \t H() \tにconsole.log(module.exports.a); "不定" 印刷されます。私の最後の更新を参照してください。 h()によってmodules.exportsが更新されないのはなぜですか? – Troskyvs

関連する問題