JavaScript 反科里化 this [译]


在JavaScript中,"反科里化"(Uncurrying)是一种将接受多个参数的函数转换成一系列使用一个参数的函数的技术,但在这个上下文中,特别是当我们谈论到`this`关键字时,我们可能是在讨论如何在函数被科里化或转换后保持或恢复其`this`上下文。

不过,通常"科里化"(Currying)本身并不直接涉及`this`的修改或保留,因为它主要是关于函数参数的转换。然而,当你将科里化函数与特定的上下文(如对象的方法)结合时,确实需要关注`this`的绑定。

JavaScript中,函数的`this`值是由函数如何被调用的决定的。在类的方法或对象的属性函数中,`this`通常指向该对象。但是,当这些方法被转换为科里化函数时,如果不小心处理,`this`的值可能会丢失。

为了“反科里化”并保持`this`的上下文,你可以使用箭头函数(Arrow Functions),因为它们不绑定自己的`this`,而是捕获其所在上下文的`this`值。但请注意,这实际上是在科里化之前或过程中保持`this`的一种方式,而不是科里化后的“反科里化”。

然而,如果你有一个科里化函数,并且想要在某个特定的`this`上下文中调用它,你可以使用`.call()`、`.apply()`或`.bind()`方法来明确设置`this`的值。

以下是一个简化的例子,展示了如何在科里化过程中保持`this`上下文,并随后在特定`this`上下文中调用它:


function MyClass() {
    this.value = 10;
}

MyClass.prototype.increment = function(n) {
    // 使用箭头函数来保持this上下文
    return function(m) {
        return this.value + n + m;
    }.bind(this); // 注意这里我们使用了bind来绑定this
};

const obj = new MyClass();
const incrementByTwo = obj.increment(2);

// 现在,无论我们如何调用incrementByTwo,this都将指向obj
console.log(incrementByTwo(3)); // 输出: 15

在这个例子中,我们并没有真正“反科里化”,而是通过在科里化过程中使用`.bind(this)`来保持`this`的上下文。这样,即使在科里化函数被调用时,`this`也始终指向原始对象。