Javascript中的Eta转换
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
(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