2017-01-02 88 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值进行评价。

在第二个值中,触发事件处理程序时评估值。