2017-11-02 15 views
0
var name = "Global"; 

function funcA() { 
    var name = "FunA"; 
    return function() { 
     console.log(this.name); 
    } 
} 

funcA()(); 

ノードを使用して私の端末でコードを実行し、undefined を返しますが、クロムコンソールではGlobalを返します。ノードenvとクロムコンソールで同じコードを実行するのが異なるのはなぜですか?

どうしてですか?

+0

申し訳ありませんが、コードを編集するだけで、グローバルで未定義の理由が表示されます。 – Dreams

+0

Node(古代0.12.4と認定された)とChromeの両方でログメッセージ 'Global'の後に戻り値' undefined'が続くのが見えます。あなたはNodeのスクリーンショットを表示できますか? ** no **環境では、 'funcA()()'は戻り値を持ちます( 'return'ed値がないため、デフォルトの' undefined'を除く)。 'function(){コンソール。ログ(this.name); } 'の中には' return'ステートメントがありません。 – apsillers

+0

また、 'name'というグローバル変数(https://stackoverflow.com/q/10523701/710446)を使用する危険性もあります。これはブラウザコードで文字列化されます。 (文字列であるためここでは問題はありませんが、他のタイプでは問題を引き起こす可能性があります) – apsillers

答えて

2

1.ブラウザ環境でこのスクリプトを実行すると、最上位のvarがグローバルwindowオブジェクトのプロパティになります。その後MDNごと:

次のコードは、strictモードではないので、この値は、呼び出しによって設定されていないため、これはブラウザ内のウィンドウでグローバルオブジェクトにデフォルト設定されます。

だから、関数内console.log(this.name);を呼び出すとthisname性質を持つことになり、グローバルwindowオブジェクトへのリンクになることを意味しています。 window.nameの値は「グローバル」です。

NodeJSにはwindowオブジェクトがありませんが、代わりにglobalオブジェクトがあります。 NodeJS環境でスクリプトを実行すると、モジュールとして実行されていない(たとえば、ノードコンソールに直接)モジュールとして実行中の (a)が、モジュールとして実行されます(node test.js経由)および ブラウザと同じ動作第二ケース(B):globalnameプロパティを受信するとthis はそうthis.nameの値がglobal.nameに等しくなると「グローバル」であろうglobalへのリンク、あろう。

しかし、最初のケースは、(A)NodeJS doc当たり、異なる:

オブジェクトグローバルネームスペースオブジェクト。

ブラウザでは、トップレベルのスコープはグローバルスコープです。つまり、ブラウザ内では、何かが新しいグローバル変数を定義します。 Node.jsではこれが異なります。トップレベルのスコープはグローバルスコープではありません。 var Node.jsモジュール内の何かは、そのモジュールに対してローカルになります。

トップレベルのVaRはノード環境でちょうどローカル変数になり、global以来console.log(this.name)ショーundefinedを呼び出して何のnameプロパティ、 を持っていないように。

+1

ですが、ノードにはグローバルオブジェクト? – Dreams

+0

だから、私の理解は、OPのコードがモジュールの内部で実行されているので、最上位の 'var name =" Global ";'がグローバル変数を作成しないように暗黙的に示唆されています。確かに、もしそれが本当なら、私はあなたがその仮定をより明確にすべきだと思うが、それはそれを説明するだろう。 – apsillers

+0

@apsillers 'var name =" Global "'の代わりに 'global.name =" Global ";'を定義すると動作します。 – dhilt

0

varは、最上位スコープ内で変数をGlobal objectに定義します。

thisは、ブラウザまたは対話型ノードセッションの場合はGlobal object、ノードモジュールとして実行するスクリプトの場合はexports-objectとなります。

厳密なモードまでです...

関連する問題