1

thisJavascript で説明している Web 上の記事をいくつか読みました。記事は非常に役に立ちましたが、以下に示す動作はまだわかりません。

ここでは次のように述べています。

グローバル実行コンテキスト ( any の外部function) では、厳密モードであるかどうかにかかわらず、 this はグローバル オブジェクトを参照します。

もしそうなら、ノードで次のコードを実行したときの動作(コメントに記載)を誰かが説明してください。

console.log(this); // Returns an empty object: {}.
                  // Why does this line not return the global object.

var somefunc = function(name) {
    console.log(this);
}

somefunc(); // Returns the the global object. I think I understand this. The function is
           // invoked in a global context.

somefunc.call(this); // Again returns the empty object. Why?

ご協力いただきありがとうございます。

EDIT(モデレーターによる以下の要求による) *この質問と選択された回答は、上記のリンクとどのように異なりますか*

ここでの質問と確かに答えの両方が、重複と見なされるものよりも明確だと思います。ここでの回答は、サンプルコードを提供することでノードが何をしているかを明確にしています。これはより役に立ちます。

4

1 に答える 1

2

の 1 番目と 3 番目の表示はthis、いずれの場合も同一である必要があります。最初の場合は の現在の値を出力するだけで、3 番目の場合は の現在の値を(コンテキスト引数として)thisに渡します。thissomefunc

しかし、2 番目の場合は異なります。特定のコンテキストを割り当てずにこの関数を呼び出すため、内部でグローバルオブジェクトthisを指します。

結果として空のオブジェクトが得られるのはなぜですか? 1つの説明は、コードが実際には次のような一般的なクロージャにラップされているということです:

var sandbox = {};
(function() {
  console.log(this);      // 1
  var somefunc = function(name) {
     console.log(this);
  }
  somefunc();             // 2
  somefunc.call(this);    // 3
}).call(sandbox);

この関数はsandboxコンテキストで呼び出されるため、1との両方が3指すsandbox- これは空のオブジェクトです。2違います:この関数呼び出しにコンテキストを提供しません。そのため、関数(そのように呼び出されたとき) はthisを指しglobalます。

thisNodeモジュールのグローバルコンテキストでアクセスしようとすると、まさにそれが起こります。この議論から説明を引用します:

Node のモジュールはクロージャでラップされ、exportsオブジェクトの this-context で評価されます。したがって、そうすると、 、、またはvar a = 3には追加されません。ただし、そうすると、 andに追加されます。thisglobalexportsthis.a = 3thisexports

参照: https://gist.github.com/788414

ブラウザ内でコードをそのまま使用するのとはまったく異なることに注意してください。クロージャーでラップされていないため、すべての呼び出し (1、2、および 3) はglobalオブジェクトを参照しています。そして、それはご存知のように、window.

于 2013-06-09T18:55:37.160 に答える