5

私は、すなわち、firefoxとnode.jsで次のコードを試しました

var x = 10;
var o = { x: 15 };
function f(){
     console.log(this.x);
}
f();
f.call(o);

ブラウザでの結果は10、15ですが、node.jsでの結果は未定義です(15)。

ブラウザとnode.jsでの「this」キーワードの動作の違いを教えてください。私はたくさんのページを読みましたが、明白な答えはありませんでした。前もって感謝します。

4

2 に答える 2

7

NodejsにロードされたJavascriptファイルは、無名関数に自動的にラップされます。

したがって、Nodeで実際に実行しているのは、次のとおりです。

(function(/* There are args here, but they aren't important for this answer */){
  var x = 10;
  var o = { x: 15 };
  function f(){
    console.log(this.x);
  }
  f();
  f.call(o);
})();

ブラウザはこれを行いません。問題は、Nodexが関数のスコープ内の単なる正規変数であり、グローバルスコープの一部ではないことです。f()このように呼び出すと、グローバルスコープthis内になります。f

グローバルスコープに直接置くxと、どちらの場合でも機能します。

this.x = 10;

これは、ブラウザのグローバルオブジェクトと、ノードのグローバルオブジェクトに配置xされます。windowglobal

通常、ノードでグローバルにロードするのではなく、ここで説明するように、コードをモジュールにグループ化します。ここにアクセスできるさまざまなグローバルなものに関する情報があります。また、ラッパーに興味がある場合は、ここで確認できます。

于 2012-12-15T20:16:08.593 に答える
2

のように通常の関数を呼び出す場合f()、厳密モードと通常モードでは動作が異なります。通常モードでthisは、はグローバルオブジェクトになります(例window)。厳密モードでは、thisになりますundefined

その違いを除けば、関数呼び出しでの割り当てはthisjavascript標準で完全に指定されているため、さまざまな状況で違いが見られる場合は、おそらくstrictモードが原因です。strict両方の環境にモードを追加すると、一貫した動作が見られるはずです。

詳細については、このMDNリファレンスの「Javascriptの保護」のセクションを参照してください。

于 2012-12-15T20:03:59.707 に答える