2014-01-24 66 views
1

在下面的代碼中,我試圖將參數「test」傳遞給回調函數。好消息是回調確實被稱爲;然而,字符串「我看到未定義」正在打印而不是「我看測試」。回調參數未被傳遞(Node.js)

var MyObject = function(){ 
} 

MyObject.prototype.b = function(data){ 
    console.log("I see " + data); 
} 

a = function(callback){ 
    callback("test"); 
} 

var it = new MyObject(); 
a(function(){it.b()}); 

我有這事做與封閉一種預感,因爲我看到了字符串「我看到測試」字樣,如果我直接調用it.b(「測試」)。爲什麼函數沒有正確接收參數?

回答

4

您正在調用it.b()而沒有參數,所以當您進入b()方法時,沒有任何參數應該不足爲奇。如果您想爲it.b()顯示參數,則必須在回調中聲明它,然後您可以將它傳遞給it.b(arg)

a(function(arg){ 
    it.b(arg) 
}); 

或者,你可以通過所有參數從回調:

a(function(){ 
    it.b.apply(it, arguments) 
}); 

或者,你可以使用.bind()

a(it.b.bind(it)); 
+0

啊,我看......我知道一個(it.b)是行不通的,所以我把一味的功能的東西因爲我在另一個網站上看到了它。我認爲這只是一種特殊的語法,但現在很明顯它實際上是在創建一個新的未命名函數。謝謝。 –

2

看來您正在創建一個新的匿名函數,您將作爲回調傳遞給a。如果您將最後一行更改爲:

a(it.b); 

一切都應按照您的預期工作。

+1

這會得到參數,但是'this'不會是'b'方法中的'it'對象。 – jfriend00

+0

當然,如果他需要'this'作爲'it'對象,他應該這樣綁定它。 – David

2

讓我們分析代碼的最後一行:

a(function(){it.b()}); 

//I will name the above function 'xyz' for convenience 
a(function xyz(){it.b()}); 

在上面的線,你傳遞一個函數XYZ作爲arguement爲()。您直接傳遞的函數會調用it.b()而不傳遞任何參數。

因此,這裏發生的是,當您將xyz傳遞給()時,將xyz作爲參數調用字符串「test」,即調用xyz(「test」)。但是這個字符串「測試」沒有任何用處,因爲你直接調用它.b()而不傳遞任何數據,因此你得到'undefined'。

爲了獲得您想要的輸出,您需要通過以下兩種方法中的任何一種編寫代碼。

方法1:

var MyObject = function(){ 
} 

MyObject.prototype.b = function(data){ 
    console.log("I see " + data); 
} 

a = function(callback){ 
    callback("test"); 
} 

var it = new MyObject(); 
a(it.b); 

方法2:

var MyObject = function(){ 
} 

MyObject.prototype.b = function(data){ 
    console.log("I see " + data); 
} 

a = function(callback){ 
    callback("test"); 
} 

var it = new MyObject(); 
a(function(data){it.b(data)});