使用多个箭头功能组合功能

时间:2017-11-19 11:04:31

标签: javascript currying

查看撰写函数(取自Redux)

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

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

    return funcs.reduce((a, b) => (...args) => a(b(...args)))
  }

const double = x => x * 2
const square = x => x * x
const double1 = x => x * 3
compose(double, square, double1)(5)

在最后一个返回语句中

funcs.reduce((a, b) => (...args) => a(b(...args)))

返回带..args的函数的目的是什么,为什么不只是

funcs.reduce((a, b) => a(b(...args))) ?

1 个答案:

答案 0 :(得分:0)

在您建议的版本中,您将返回a(b(...args))的结果,而您尚未通过args。因此,您将收到args未定义的编译错误。

但是在上面的变体中它返回一个函数,它接受参数(args -  5作为args传递,并返回a(b(...args))的结果

(...args) => a(b(...args))

看看这个例子。它通过两种方法显示出差异。

function a(str) {
  console.log('In a');
  console.log(str);
  return str;
}

function b(str) {
  console.log('In b');
  console.log(str);
  return str;
}

const message = a(b('text')); // This is your variant. Immediate result.
console.log(`Message is ${message}`);

const func = (someText) => a(b(someText)); // This is the given variant. Need to call `func` to get the result.

const anotherMessage = func('anotherText'); Here I need to call `func` and pass my parameter to it.
console.log(`Message is ${anotherMessage}`);