首页 > 解决方案 > 更改绑定函数参数

问题描述

给定一个简单的函数:

const a = (x) => (y) => x + y

及其部分应用的版本:

const b = a(3)

有什么办法可以改变已经绑定的参数b吗?就像是

b.boundArgs[0] = 5

所以如果我打电话b(5)它会返回10而不是8


一点背景:

我使用一个库,它返回部分应用的函数作为库函数调用之一的结果。
我必须修改第一个参数(由库函数应用)并且我不想复制粘贴此函数的实现。除了这个小修改外,我想留在图书馆。

标签: javascriptfunctionbindingpartialcurrying

解决方案


不,你不能这样做,除非有问题的图书馆可以做到这一点。它可以,但可能不会。

基本上你要问的是你是否可以进入一个函数关闭的执行上下文并在该上下文中更改变量值(更准确地说是bindings)。你不能默认。使用更详细的示例:

const a = (x) => {
    const b = (y) => x + y;
    return b;
};

默认情况下,您无能为力b,让您进入并更改x环境b关闭。

之前我说过图书馆可以让你这样做,但可能不会。这是它可以做到这一点的一种方法:

const a = (x) => {
    const b = (y) => x + y;
    b.changeX = (newX) => {
        x = newX;
    };
    return b;
};
const b = a(3);
b.changeX(10);
console.log(b(5)); // 15 instead of 8

您仍然无法找出x绑定的内容b,但您可以通过changeX.

或者库可以只在它返回的函数上使用一个属性:

const a = (x) => {
    const b = (y) => b.x + y; // Note b.x
    b.x = x;                  // Initial value
    return b;
};
const b = a(3);
b.x = 10;
console.log(b(5)); // 15 instead of 8

我并不是以任何方式暗示这是一个好主意,封装通常有一个重要的目的。只是指出有可能做这种事情。


推荐阅读