Javascript 函数单独工作,但不能组合在一起

Javascript 函数单独工作,但不能组合在一起,javascript,Javascript,我正在尝试一个非常简单的程序来理解JavaScript中的组合函数 //此组合来自web const compose=(…fns)=>x=>fns.reduceRight((v,f)=>f(v,x); 常量数组='array' const actionCreator=(类型、有效负载)=>{ 返回{ 类型 有效载荷 } }; 常量日志=对象=>{ console.log(对象) }; //这很有效 日志(actionCreator(数组[1,2,3,4]); //这是不可能的 组合(日志,ac

我正在尝试一个非常简单的程序来理解JavaScript中的组合函数

//此组合来自web
const compose=(…fns)=>x=>fns.reduceRight((v,f)=>f(v,x);
常量数组='array'
const actionCreator=(类型、有效负载)=>{
返回{
类型
有效载荷
}
};
常量日志=对象=>{
console.log(对象)
};
//这很有效
日志(actionCreator(数组[1,2,3,4]);
//这是不可能的

组合(日志,actionCreator)(数组[1,2,3,4])
很明显,您的compose函数需要“x”,但您正在传递“(数组,[1,2,3,4]),因此实际上“x”成为第一个参数,即“数组”,但第二个参数未定义,因为您没有将其传递给累加器的初始值

您可以调整
compose()
函数:

const compose = (...fns) => (...args) => 
    fns.reduceRight((v, f, i) => (i !== fns.length - 1) ? f(v) : f(...args), null);
这将使用为第一个函数提供的参数列表,然后表现为
。reduceRight
通常表现为其余函数,使用上一次迭代的返回值作为下一次迭代的输入值

.reduceRight()
null
作为输入开始,因为第一次迭代将不使用该输入

编辑-以下是一个更简单的版本:

const compose = (...fns) => (...args) => fns.reduceRight((v, f) => f(v), fns.pop()(...args));

该函数使用应用于参数的最后一个函数作为
.reduceRight()

您的
compose()
函数的初始值,该函数返回一个需要一个参数的函数,但您用两个参数调用它。在compose的内部函数中,您需要一个参数
x
,但您要发送两个
数组,[1,2,3,4]
你能建议一种方法来解决这个问题吗,也许compose应该保持不变吗?我明白了。那么我应该更改什么,actionCreator,还是自己编写呢?非常感谢。它很有效!很抱歉,但似乎我错了。它不起作用,你的代码中有未使用的v,这有什么问题吗?@FreeMe你是对的,等等…@FreeMe好的,我错了erstood,将更新shortly@FreeMe检查更新