最近node.jsで悩んでおり、モジュールのグローバルスコープでthis
という使用法に関する奇妙な動作に遭遇しました。node.js:グローバルスコープでの 'this'の使い方が混乱しています
this
はグローバルスコープでmodule.exportsはにバインドされています
console.log(this === exports); // -> true
しかしthis
はメソッドスコープでグローバルにバインドされています
(function() { console.log(this === global); })(); // -> true
これもこの混乱の動作につながる:
this.Foo = "Weird";
console.log(Foo); // -> throws undefined
(function() { this.Bar = "Weird"; })();
console.log(Bar); // -> "Weird"
私は解がt o this
をグローバルスコープで使用せず、代わりにextends
またはglobal
を明示的に使用しますが、これには論理がありますか、またはnode.jsのバグまたは制限ですか?
グローバルスコープの 'this'が' extended'の代わりに 'global'にバインドされていたのでは、あまり混乱しないでしょうか?私は、グローバルスコープと静的関数スコープで同じ意味を持つことを期待しています。 –
@SelflessCoder:なぜこれが 'exports'オブジェクトに結びついているのか分かりません。しかし、一般的には、グローバルオブジェクトをデータでぶつけないようにすることをお勧めします。したがって、どのような関数コンテキストでも、どのように呼び出されるかによって、異なる 'this'値を持つことができることに留意してください。 – jAndy
jAndyは言うとおり、これは基本的にjavascriptで 'this'がどのように動作するかです。私はそれについての議論を読んでいないが、グローバルスコープで 'this === exports 'を持つことは、ブラウザーのグローバルスコープで' this === window'と類似していると考えられます。 IMOは、グローバルスコープで 'this === global'を持つことは、' this.foo === foo'を意味するので意味がありません。 –