2013-01-13 37 views
1

可能重複:
JavaScript 「this」 keyword關於 '這' 在回調中在node.js中

我有點困惑用於node.js中EventEmitter的回調

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裏面?回調函數的閉包是這段代碼中的全局範圍,對嗎?

回答

6

範圍與確定來自上下文的this的值無關。這取決於函數的調用方式。您加載的事件模塊將在myobject的環境中調用它。

relevant code是:

listener.apply(this, args); 

the apply method的第一個參數是用於調用函數(listener)的上下文。你可以從那裏追溯到對象。

+0

我明白了。那麼,節點是否也通過「應用」對象來調用回調函數?我是節點以及javascript的新手,所以我想這是每個API都實現的標準方式嗎? – Andariel

+0

事件庫不是,不是節點本身。事件API可以通過多種方式實現,幾乎所有的事情都會使這個事件綁定的對象成爲這個對象。 – Quentin

1

這與大部分節點代碼庫相同。很長一段時間以前有關於此的一個小討論,並且共識是.call(this)需要太多的開銷,並且到處都是醜陋/煩人的。換句話說,永遠不要假設你認爲this

編輯:無所謂,EventEmitter沒有具體適用於這種情況,我完全誤解了你的問題。

+1

我強烈懷疑假定EventEmitter總是安排'this'來引用作爲事件目標的對象是安全的。 – Pointy

+0

那麼根據Quentin的答案中的代碼,它肯定會。 – Pointy

+0

@好的,是的,我誤解了這個問題,因爲「這個'不等於我的對象」。我的回答是非常不相關的(我指出在節點和節點模塊中有很多地方不會在上下文中調用回調)。你是對的,EventEmitter :: emit不是其中之一。 – chjj