Javascript 部分应用功能仅第一次起作用。

Javascript 部分应用功能仅第一次起作用。,javascript,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 (arg

我已经定义了自己版本的
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);
  };
};
它确实像我所期望的那样打印出XXX。但是当我尝试重用函数
delay
,它似乎不起作用:

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

甚至上面的代码片段也会打印
XXX
!!我不确定我在哪里犯了错误

问题在于,您修改了调用函数时保留的
args
;后续调用将重用修改后的参数,因为您只填写那些
未定义的

如果这是有意的(填补漏洞),那么每次修改副本之前,您都需要制作一份
partialArgs
,请参见
***
注释:

const partial=函数(fn,…partialArgs){
//***此处不创建“args”
返回函数(…fullArguments){
设arg=0;
让args=partialArgs.slice();//***在修改之前在此处复制一份
for(设i=0;iconsole.log(“XXX”))

延迟(()=>console.log(“YYY”)
您是否打算让
部分
完整参数
中的参数替换
部分参数
中未定义的参数?这是一种非常不寻常的局部应用形式,但我可以看到用例。…@T.J.Crowder:是的,这正是我想要做的!LGTM,if语句可以简化
args[i]=args[i]| | fullArguments[arg++]我的坏!我尝试在返回函数中移动
args
。但完全忘记了它使用的是原始参考!
delay(() => console.log("YYY"))