1

重複の可能性:
JavaScript の「this」キーワード

EventEmitternode.js の に使用されるコールバックについて少し混乱しています。

var events = require("events");

function myObject() {
    this.name = "Test Object";
    this.x = 99;
    this.y = 100;
}

myObject.prototype = new events.EventEmitter();

var myobject = new myObject();

myobject.addListener('dbg1', function() {
    console.log("this.name = " + this.name);    //this.name gives the name not undefined
    console.log("myobject.name = " + myobject.name);        //so does this 
});

myobject.emit('dbg1');

thisコールバック内で が参照されているの はなぜmyobjectですか? コールバック関数のクロージャーは、このコードのグローバル スコープですよね?

4

2 に答える 2

6

thisスコープは、コンテキストから得られるの値を決定するのには関係ありません。これは、関数の呼び出し方法によって決まります。ロードしたイベント モジュールは、 のコンテキストでそれを呼び出しますmyobject

関連するコードは次のとおりです。

listener.apply(this, args);

メソッドの最初の引数はapply関数の呼び出しに使用するコンテキストです ( listener)。そこからオブジェクトまでさかのぼることができます。

于 2013-01-13T18:10:36.520 に答える
1

これは、ほとんどのノード コードベースで同じです。これについてはかなり前に小さな議論がありましたが、コンセンサスは、.call(this)オーバーヘッドが多すぎて、どこにでも置くのが本当に醜い/面倒だということでした。言い換えれば、それthisがあなたの考えだと思い込まないでください。

編集:気にしないでください、EventEmitterはこの場合特に適用されず、あなたの質問を完全に読み違えました。

于 2013-01-13T18:10:41.653 に答える