1.ブラウザ環境でこのスクリプトを実行すると、最上位のvarがグローバルwindow
オブジェクトのプロパティになります。その後MDNごと:
次のコードは、strictモードではないので、この値は、呼び出しによって設定されていないため、これはブラウザ内のウィンドウでグローバルオブジェクトにデフォルト設定されます。
だから、関数内console.log(this.name);
を呼び出すとthis
はname
性質を持つことになり、グローバルwindow
オブジェクトへのリンクになることを意味しています。 window.name
の値は「グローバル」です。
NodeJSにはwindow
オブジェクトがありませんが、代わりにglobal
オブジェクトがあります。 NodeJS環境でスクリプトを実行すると、モジュールとして実行されていない(たとえば、ノードコンソールに直接)モジュールとして実行中の (a)が、モジュールとして実行されます(node test.js
経由)および ブラウザと同じ動作第二ケース(B):global
はname
プロパティを受信するとthis
はそうthis.name
の値がglobal.name
に等しくなると「グローバル」であろうglobal
へのリンク、あろう。
しかし、最初のケースは、(A)はNodeJS doc当たり、異なる:
オブジェクトグローバルネームスペースオブジェクト。
ブラウザでは、トップレベルのスコープはグローバルスコープです。つまり、ブラウザ内では、何かが新しいグローバル変数を定義します。 Node.jsではこれが異なります。トップレベルのスコープはグローバルスコープではありません。 var Node.jsモジュール内の何かは、そのモジュールに対してローカルになります。
トップレベルのVaRはノード環境でちょうどローカル変数になり、global
以来console.log(this.name)
ショーundefined
を呼び出して何のname
プロパティ、 を持っていないように。
申し訳ありませんが、コードを編集するだけで、グローバルで未定義の理由が表示されます。 – Dreams
Node(古代0.12.4と認定された)とChromeの両方でログメッセージ 'Global'の後に戻り値' undefined'が続くのが見えます。あなたはNodeのスクリーンショットを表示できますか? ** no **環境では、 'funcA()()'は戻り値を持ちます( 'return'ed値がないため、デフォルトの' undefined'を除く)。 'function(){コンソール。ログ(this.name); } 'の中には' return'ステートメントがありません。 – apsillers
また、 'name'というグローバル変数(https://stackoverflow.com/q/10523701/710446)を使用する危険性もあります。これはブラウザコードで文字列化されます。 (文字列であるためここでは問題はありませんが、他のタイプでは問題を引き起こす可能性があります) – apsillers