2017-11-04 149 views
0

假設有兩個函數。在javascript中使用箭頭函數進行回調

function foo(callback) { 
... 
} 

function bar() { 
... 
} 

有什麼區別時,我打電話foo(bar)foo(() => bar())假設酒吧不需要參數?

我最近前一個發生錯誤this上下文,而第二個工作正常。我知道箭頭函數將this上下文綁定到函數中,我不知道有什麼區別。

僅供參考,這裏是有問題的代碼。

socket.disconnect(socket.connect); // line 1 

socket.disconnect(() => socket.connect()); // line 2 

socket.disconnect(function() { socket.connect(); }); // line 3 

我剛發現問題可能與上下文無關。這可能是應用或綁定的東西。因爲第2行和第3行工作正常,而只有第1行顯示錯誤。

+1

你有研究的'this'的主題?有很多關於SO的信息,你可以通過一個簡單的搜索找到... – trincot

+0

_「我知道箭頭函數綁定這個上下文」_,不,它不綁定任何上下文,「this'將會是什麼外部範圍。 –

+0

「箭頭函數是匿名的,並改變了它在函數中綁定的方式。」我在文檔中閱讀它。 – emil

回答

2

首先,你所描述的與箭頭功能無關。

this的值取決於函數如何被稱爲。當一個函數是一個對象的屬性並且被調用爲foo.bar()時,foo.bar中的this將引用foo

所以在你的最後兩個例子中,this將引用socket而不是socket.connect

在您的第一個示例中,this將引用另一個值,因爲該函數不會作爲socket的方法執行。但socket.connect可能預計有thissocket


簡單的例子:

function foo(callback) { 
 
    callback(); 
 
} 
 

 
var socket = { 
 
    connect() { 
 
    "use strict"; 
 
    console.log(this); 
 
    }, 
 
}; 
 

 
foo(socket.connect);     // undefined 
 
foo(() => socket.connect());   // socket object 
 
foo(function() { socket.connect()}); // socket object