为什么语法 func1(func2)(parameters);工作,它叫什么?

Why does the syntax func1(func2)(parameters); work and what is it called?

摘自本书 Eloquent Javascript 第三版,第 5 章。 我似乎无法在我的研究中找到这个结构 'f()()',我想了解更多关于它的信息。

我希望能够使用

noisy(Math.min(3, 2, 1)); 

但是这样做时没有输出。 但是,本书示例按预期工作。但是怎么办?

图书示例:

function noisy(f) {
  return (...args) => {
    console.log('calling with', args);
    let result = f(...args);
    console.log('called with', args + ', returned', result);
    return result;
  };
}    
noisy(Math.min)(3, 2, 1);

f()() 调用一个名为 f 的函数,它大概是 returns 一个函数 - 然后,最后的 () 调用那个返回的函数。例如

const f = () => {
  console.log('first invoke');
  return () => console.log('second invoke');
};

const returnedFn = f();
console.log('----');
returnedFn();

f()() 与上面类似,只是它不将 returnedFn 存储在变量中 - 相反,它只是立即执行 returnedFn

这与 noisy 正在做的事情相同 - 它 returns 是一个函数,因此如果您想立即调用返回的函数而不将返回的函数存储在任何地方,请将另一个 () 在调用 noisy.

之后

的问题
noisy(Math.min(3, 2, 1))

是它立即调用 Math.min - 解释器将其简化为

noisy(1)

在调用 noisy 之前,因此 noisy 看不到有关 Math.min 或调用它的参数的任何信息。 (但是 noisy 函数的全部意义在于记录函数的输入和输出)

noisy() 接受一个函数作为参数(let result = f(...args); 行很明显)。 Math.min(3, 2, 1) 解析为一个值,而不是一个函数,这就是为什么它在传递给 noisy().

时不起作用的原因

f()() 的意思是函数 f returns 一个函数,然后执行它本身。分解成这样可能更容易理解:

let g = f();
let result = g();

noisy 接受一个函数作为参数,returns 也接受一个函数。每当您尝试 noisy(Math.min(3, 2, 1)); 时,您都会将 Math.min(3, 2, 1) 的结果传递给嘈杂,这与调用 noisy(1).

相同

您也可以将令人困惑的指令分成两部分:

let noisyMin = noisy(Math.min);
noisyMin(3, 2, 1);

基本上你只是得到一个函数作为 noisy(Math.min) 的结果然后你马上调用它。

f()() 只有在 f() returns 一个函数时才有可能。