2017-01-02 90 views
1

In a previous question,我被鼓勵去問這個後續問題:如果我知道some.func只需要一個參數,它會把函數some.func包裝成類似(arg) => some.func(arg)的東西有什麼區別?封閉函數的區別?

舉一個具體的例子:在我的其他問題,我觀察到一個令人驚訝的差異使用

.on("mouseover", tip.show) 

之間對

.on("mouseover", (d) => tip.show(d)) 

在這種情況下,第一個版本確實有預期的行爲,而第二版本的行爲有所不同(請參閱jsfiddle of other question)。這裏的原因是我不小心讓tip成爲全球性的。

更一般的問題:爲什麼他們的行爲不一樣呢?

回答

3

當您使用tip.show(d)時,該函數將被稱爲傳遞tip作爲this值。

當您使用tip.show作爲事件偵聽器時,將使用當前事件目標作爲this值調用它。

var obj = {checkThis: function(e) { 
 
    console.log(this === e.currentTarget, this === obj); 
 
}}; 
 
document.body.addEventListener('click', obj.checkThis);   // true, false 
 
document.body.addEventListener('click', e => obj.checkThis(e)); // false, true 
 
document.body.click();

2

有兩個主要的區別。

我們需要看到更多的上下文來確定在這種情況下應用哪些應用。

this

thisshow函數內的值取決於函數是如何被調用。

如果事件處理函數本身是函數,那麼this是事件處理程序綁定的對象。

如果事件處理程序是調用tip.show的函數,則thistip

進一步閱讀:How does the 「this」 keyword work?

時序

在一種情況下,當事件處理程序被註冊的tip.show值進行評價。

在第二個值中,觸發事件處理程序時評估值。