Javascript中的Eta转换

Javascript中的Eta转换,javascript,higher-order-functions,Javascript,Higher Order Functions,Eta转换将函数(x)=>f(x)视为与函数f相同。在工作中重构代码时,我试图使用这种等价性简化一些高阶函数调用。然而,事情并没有完全解决,我对实际发生的事情有些迷茫,因为我对Javascript非常陌生。这里有一个最小的例子,我希望能正确地说明我的问题 const station = { take: (f) => f(5), love: function(car) { this.take((x) => car.addFuel(x)); }, hate: fu

Eta转换将函数
(x)=>f(x)
视为与函数
f
相同。在工作中重构代码时,我试图使用这种等价性简化一些高阶函数调用。然而,事情并没有完全解决,我对实际发生的事情有些迷茫,因为我对Javascript非常陌生。这里有一个最小的例子,我希望能正确地说明我的问题

const station = {
  take: (f) => f(5),
  love: function(car) {
    this.take((x) => car.addFuel(x));
  },
  hate: function(car) {
    this.take(car.addFuel);
  }
};

const mercedes = {
  fuel: 0,
  addFuel: function(amount) {
    this.fuel += amount;
  }
};

station.love(mercedes);
console.log(mercedes.fuel);
// output: 5

station.hate(mercedes);
console.log(mercedes.fuel);
// output: 5; expected output: 10

根据eta等价性,我期望
station
对象中的
love
hate
函数的行为相同。然而,似乎
hate
函数实际上什么都不做。这里发生了什么?

这是一个范围问题。在
hate
回调
中的原始代码中,此
引用全局
窗口
对象。您需要使用来绑定此的正确范围

const站={
取:(f)=>f(5),
爱:功能(汽车){
这个.take((x)=>car.addFuel(x));
},
讨厌:功能(汽车){
这个.拿(车.加油.绑(车));
}
};
常数梅赛德斯={
燃料:0,
添加燃料:功能(数量){
此值。燃料+=数量;
}
};
爱情车站(梅赛德斯);
控制台。日志(梅赛德斯。燃料);
仇恨(梅赛德斯);

控制台。日志(梅赛德斯。燃料)我认为这里的问题是对象范围
love
被包装在一个箭头函数中,该函数在
这个范围上有不同的定义。而
hate
则直接使用
addFuel
功能,该功能将
范围设置为“station”对象。对不起,如果我不能解释清楚的话。英语不是我的母语。在原始代码中,如果
this
指的是窗口对象,那么调用
this.take
怎么可能有效?由于在全局名称空间中没有声明
take
函数。很抱歉误解,但我指的是梅赛德斯中的
,它指的是
窗口
,您可以通过在控制台中执行代码段,然后键入
窗口.fuel
进行验证,当您尝试将
5
undefined