如何在JavaScript中动态创建高阶函数?

时间:2018-08-06 08:09:09

标签: javascript function higher-order-functions

我正在尝试编写一个JavaScript函数,该函数可以让我执行以下操作:如果我调用

const multiply = define("x", "y", "x * y");

我希望multiply

function(x) {
    return function(y) {
        return x * y;
    }
}

参数数量事先未知。最后一个总是最终的返回值,其他每个参数都是内部函数的参数。我的define函数应该是什么?

我知道我只能编写const multiply = x => y => x * y,但是我需要代码尽可能地易于使用,并且对于那些不经常使用它们的人来说,这样的高阶函数并不十分清楚。< / p>

我尝试使用Function构造函数,但我设法拿出的大部分代码都返回了function(x, y) { return x * y; },这不是我想要的。

我的想法是逐步构建函数,因此我首先必须创建一个函数f,该函数需要y并返回x * y,然后我必须创建{{ 1}},它取g并返回x。但这就是我被困住的地方。

任何人都可以给我一个有关如何解决此问题的线索吗?谢谢。

1 个答案:

答案 0 :(得分:0)

通常,在运行时从文本创建代码不是一个好主意。但是如果您信任从中创建函数的文本源,则可以使用new Function从文本创建函数。请注意,从本质上讲,它允许任意代码执行。

在您的情况下,如果最后一个参数始终是最终函数的主体,而导致该参数的最后一个参数是参数名称,则应执行循环:

function define(...args) {
  // Build the text of the functions
  let text = "";
  for (let n = 0; n < args.length; ++n) {
    if (n == args.length - 1) {
      text = text + "(" + args[n] + ")";
    } else {
      text = text + "(" + args[n] + ") => ";
    }
  }
  console.log(text);
  // Create them by creating a wrapper function and executing it.
  // If we wanted to complicate the logic above,
  // we could just use this to create the top-
  // level function and not execute it, but this
  // is simpler.
  return new Function("return " + text + ";")();
}
const multiply = define("x", "y", "x * y");
console.log("multiply(3)(5) => ", multiply(3)(5));
const multiply2 = define("x", "y", "z", "x * y * z");
console.log("multiply2(3)(5)(2) => ", multiply2(3)(5)(2));
.as-console-wrapper {
  max-height: 100% !important;
}