【问题标题】:Change bound function parameters更改绑定函数参数
【发布时间】:2018-12-30 04:27:43
【问题描述】:

给定一个简单的函数:

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

及其部分应用的版本:

const b = a(3)

有没有办法改变b中已经绑定的参数?类似的东西

b.boundArgs[0] = 5

所以如果我调用b(5),它将返回10 而不是8


一点背景:

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

【问题讨论】:

  • 不,在你的例子中没有办法做到这一点。
  • 初始函数在哪里调用?你必须修改它
  • @JonasW。在库中调用了初始函数,所以我不能修改它
  • 那就不可能了:/
  • @Pointy 这意味着唯一的方法是复制库实现并修改它?

标签: javascript function binding partial currying


【解决方案1】:

不,除非相关库允许这样做,否则您不能这样做。它可以,但可能不会。

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

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

默认情况下,您无法使用 b 执行任何操作,让您在 b 关闭的环境中进入并更改 x

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

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

您仍然无法找出xb 绑定的内容,但您可以通过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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 2012-11-09
    • 2019-10-29
    • 1970-01-01
    相关资源
    最近更新 更多