部分应用功能仅适用于第一次。

时间:2016-08-07 06:28:57

标签: javascript

我已经定义了我自己的partial函数版本:

const partial = function (fn,...partialArgs){
  let args = partialArgs;
  return function(...fullArguments) {
    let arg = 0;
    for (let i = 0; i < args.length && arg < fullArguments.length; i++) {
      if (args[i] === undefined) {
        args[i] = fullArguments[arg++];
        }
      }
      return fn.apply(null, args);
  };
};

当我使用它时:

let delay = partial(setTimeout,undefined,100)
delay(() => console.log("XXX"))

它按照我的预期打印XXX。但是当我尝试重用函数delay时,似乎它不起作用:

delay(() => console.log("YYY"))

即使是上面的代码段打印XXX !!我不知道我在哪里弄错了。

1 个答案:

答案 0 :(得分:3)

问题是你修改调用函数时保留的args;后续调用会重用已修改的args,因为您只填写了undefined

如果这是故意的(填补漏洞),那么每次修改副本之前都需要复制partialArgs,请参阅***评论:

const partial = function(fn, ...partialArgs) {
  // *** Not creating `args` here
  return function(...fullArguments) {
    let arg = 0;
    let args = partialArgs.slice(); // *** Make a copy here before modifying
    for (let i = 0; i < args.length && arg < fullArguments.length; i++) {
      if (args[i] === undefined) {
        args[i] = fullArguments[arg++];
      }
    }
    return fn.apply(null, args);
  };
};

let delay = partial(setTimeout, undefined, 100)

delay(() => console.log("XXX"))

delay(() => console.log("YYY"))