javascript表达式分隔,

时间:2017-12-16 12:38:06

标签: javascript

我偶然发现了这个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文章,表达式从左到右进行评估,最后一个被返回。在这个例子中,我对我没有任何意义。

2 个答案:

答案 0 :(得分:3)

fns.reduce((y, f) => f(y), x)

如果你格式化它,它可能更有意义。

fns.reduce(
  (y, f) => f(y), 
  x
)

因此(y, f) => f(y)是第一个要减少的参数( reducer函数),xreduce的第二个参数,这是初始值

总之,由于缺乏箭头功能的分组,你被抛弃了。 :)

答案 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);
        }
    }