查看撰写函数(取自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))) ?
答案 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}`);