带有绑定的部分函数

问题描述 投票:0回答:3

最近我发现你可以使用bind对js进行部分函数/柯里化。 例如:

const foo = (a, b, c) => (a + (b / c))
foo.bind(null, 1, 2) //gives me (c) => (1 + (2 / c))

然而,只有当你想要柯里化的部分按顺序排列时,这才有效。如果我想使用bind实现以下目标怎么办?

(b) => (1 + (b / 2))

尝试了各种解决方案,例如:

foo.bind(null, 1, null, 2)

有什么想法吗?是否可以使用 vanilla es6 来完成此任务?

javascript ecmascript-6 bind currying partial-application
3个回答
3
投票

您可以使用包装器来重新排序参数。

const
    foo = (a, b, c) => a + b / c,
    acb = (a, c, b) => foo(a, b, c);

console.log(acb.bind(null, 1, 2)(5));


0
投票

目前我考虑两种方法来实现这一点(除了@NinaSholz 的包装器,这非常好):

1.使用
curry
函数合并两个参数数组:

const foo = (a, b, c) => a + b / c;

function curry(fn, ...args) {
  return function(...newArgs) {
    const finalArgs = args.map(arg => arg || newArgs.pop());
    return fn(...finalArgs);
  };
}

const curriedFoo = curry(foo, 1, null, 2);

console.log(curriedFoo(4)) // Should print 1 + 4 / 2 = 3

这里我们只是发送

null
undefined
来代替我们想要跳过的参数,在第二次调用中我们按顺序发送这些参数

2.使用对象作为命名参数

const foo = ({a, b, c}) => a + b / c;

function curry(fn, args) {
  return (newArgs) => fn({ ...args,
    ...newArgs
  });
}

const curriedFoo = curry(foo, {
  a: 1,
  c: 2
});

console.log(curriedFoo({
  b: 4
}));

这里我们利用函数签名中的

...
(扩展)运算符和对象语法来合并两个参数对象;


-1
投票

你可以将它包装在一个函数中

const foo = (a, b, c) => (a + (b / c))

_ => foo(1, _, 2) // 给你 (b) => (1 + (b / 2))

© www.soinside.com 2019 - 2024. All rights reserved.