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

时间:2019-11-03 22:17:04

标签: javascript function arguments higher-order-functions

摘自《 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);

3 个答案:

答案 0 :(得分:2)

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

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

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

f()()与上面的类似,不同之处在于它不将returnedFn存储在变量中,而是立即执行returnedFn

这与noisy所做的事情相同-它返回一个函数,因此,如果要立即调用返回的函数而不将返回的函数存储在任何地方,请在调用{之后再放置一个() {1}}。

问题

noisy

是它正在立即调用noisy(Math.min(3, 2, 1)) -解释程序将其简化为

Math.min

在调用noisy(1) 之前,因此noisy看不到有关noisy或调用它的参数的任何信息。 (但是Math.min函数的重点是记录一个函数的输入和输出)

答案 1 :(得分:1)

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

f()()的全部含义是函数f返回一个函数,然后该函数本身将被执行。如果我们将其分解成这样,可能会更容易理解:

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

答案 2 :(得分:0)

noisy接受一个函数作为参数,并返回一个。每当您尝试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()返回一个函数时可用。