我偶然发现了这个javascript声明:
const pipe = (...fns) => x => fns.reduce((y, f) => f(y), x);
我不明白表达式 f(y),x 。通过一些实验,我发现这也有效: f(y(x))。它给出了完全相同的结果(至少对我的例子而言,对我来说更容易理解)。
const pipe1 = (...fns) => x => fns.reduce((y, f) => f(y), x);
const pipe2 = (...fns) => x => fns.reduce((y, f) => f(y(x)));
const addThree = x => x + 3;
const addTwo = x => x + 2;
let x1 = pipe1(addTwo, addThree)(2); //x1 is seven
let x2 = pipe2(addTwo, addThree)(2); //x2 is seven
然后我认为这是 x,y x(y)的一些语法糖,并尝试了这个:
let z = n => addThree, n; //addThree(n)? no, that does not work!
我需要了解表达式 f(y),x)。是的我读了一些stackoverflow文章,表达式从左到右进行评估,最后一个被返回。在这个例子中,我对我没有任何意义。
答案 0 :(得分:3)
fns.reduce((y, f) => f(y), x)
如果你格式化它,它可能更有意义。
fns.reduce(
(y, f) => f(y),
x
)
因此(y, f) => f(y)
是第一个要减少的参数( reducer函数),x
是reduce
的第二个参数,这是初始值
总之,由于缺乏箭头功能的分组,你被抛弃了。 :)
答案 1 :(得分:1)
"值-X"将成为x变量,作为第二个参数传递给reduce函数。
const pipe = (...fns) => x => fns.reduce((y, f) => f(y), x);
const foo = pipe(func1, func2, func3);
foo("Value-X");
表达式可以这样重写,如果它有助于澄清事情:
function pipe(...fns) {
return function (x) {
function chain(y, f) {
// y = previous return value
// If this is the first time the function is called, y = x
return f(y);
}
return fns.reduce(chain, x);
}
}