Array.reduce有点复杂的语句?

时间:2019-04-05 12:37:20

标签: javascript

export default function compose(...funcs) {
  if (funcs.length === 0) {
    return arg => arg
  }

  if (funcs.length === 1) {
    return funcs[0]
  }

  // what does this line do???
  return funcs.reduce((a, b) => (...args) => a(b(...args)))
}

我正在从redux模块中读取compose.js源代码。我知道reduce函数的基础,它只是在集合中的每个元素中调用reducer并返回单个输出。它有一个累加器,用于存储中间结果并将其传递给reducer的每个调用。但是减少该代码对我来说有点含糊,有人可以用外行的方式解释它吗?

1 个答案:

答案 0 :(得分:0)

(a, b)可以写为(previousComposition, currectFunc)。减少的结果是一个函数使用(...args)-一个或多个参数。

每个减少的“循环”都返回一个函数,该函数用当前函数a(b(...args))组成先前的合成-可以理解为(a . b)(x) = a(b(x))

仅返回一个函数,这意味着这些函数尚未执行。当结果合成函数被调用时,它首先发生:var res = compose(a, b)(x)

示例:

var plus1 = x => x + 1;
var plus2 = x => x + 2;
var mult2 = x => x * 2;

var composedFn = compose(mult2, plus2, plus1); 
// (...x) => mult2(plus2(plus1(...x))) 

var res = composedFn(3);

console.log(res); // 12

如示例中所示,首先应用plus1,然后应用plus2,最后应用mult2