JavaScript ES6双箭头函数

25

我希望更好地理解ES6箭头函数。

考虑以下示例:

    export default function applyMiddleware(...middlewares) {
      return (createStore) => (reducer, preloadedState, enhancer) => {
        // snip actual enhancer logic

        return {
            ...store,
            dispatch
        }
    }
}

用文字描述上述内容:

  1. 我们导出的函数(applyMiddleware)带有扩展运算符的数组参数。
  2. 然后applyMiddleware返回一个不带名称的函数,该函数带有一个createStore参数,返回另一个这次带有三个参数的无名称函数。

因此,没有箭头,它看起来像这样:

export default function applyMiddleware(...middlewares) {
  return function(createStore){
      return function(reducer,preloadedState,enhancer){
        //some logic

          return{...store,dispatch}
      }
    }
}

我的问题:

  1. 我是正确的吗?
  2. 我们在这里看到的通用用例/代码范例是什么?

2
你问什么了? - Nina Scholz
1
那不是关于数组参数的扩展,而是收集传递给函数的参数一个数组中。很容易混淆,因为相同的运算符应用于函数调用中的数组(而不是定义),其效果相反。 - Jared Smith
3
为什么不直接在 Babel 中运行代码并查看输出结果呢? https://babeljs.io/repl/ - Jared Smith
这回答解决了你的问题吗?JavaScript中多个箭头函数是什么意思? - Michael Freidgeim
2个回答

39

对于你的第一个问题,答案或多或少(请参见我的评论)。对于你的第二个问题,你看到的模式是使用闭包柯里化的组合。导出函数的原始参数被聚集到一个名为“middlewares”的数组中,返回的函数则会对其进行封闭(即可以访问)。然后,该函数可以再次调用,带有另一个参数“createStore”,然后返回另一个函数,该函数可以接受更多的参数。这允许我们部分应用参数。对于一个更为简单(也许更容易理解)的例子,让我们来看一个称为“add”的函数,它将两个数字相加:

let add = (x, y) => x + y;

这段内容并不是很有趣。但是我们可以将其分解,使其接受第一个数字并返回一个接受第二个数字的函数:

let add = x => y => x + y;
let add3 = add(3);
let seven = add3(4); // 7

这对于我们的add函数可能看起来不是很重要,但你从一个更加合理的现实世界的例子开始了。此外,不必手动进行柯里化,可以使用柯里化函数,许多流行的库(lodash、underscore、ramda)都为您实现了柯里化。以下是使用Ramda的示例:
let add = R.curry((x, y) => x + y);
let add3 = add(3);
let five = add3(2);
let also5 = add(3, 2);
let still5 = add(3)(2); // all are equivalent.

@S.Schenk,不客气。当你第一次接触这些东西时可能会很难,但是一旦你习惯了,编写没有良好支持的语言将是痛苦的 - Jared Smith

20

这篇回答是给那些在双箭头函数方面仍然有疑问的人。让我们深入探讨一下。


This answer is for those who still have some doubts in double arrow functions. Lets dig deep into it.
const doubleArrowFunc = param1 => param2 => {
   console.log('param1', param1);
   console.log('param2', param2);
}

如果您调用此函数

const executeFunc = doubleArrowFunc('Hello');

如果你在控制台打印executeFunc,你会得到这样一个输出

ƒ (param2) {
    console.log('param1', param1);
    console.log('param2', param2);
  }

现在这就像是一段半成品的代码。如果你想完全执行它,你需要像这样做。

executeFunc('World');
//And the output will be 
param1 Hello
param2 World
如果您想更加了解,我可以执行同样的操作但不使用箭头函数。
function doubleArrowFunc(param1) {
    return function innerFunction(param2) {
       console.log('param1', param1);
       console.log('param2', param2);
    }
}

1
这个答案解释得更好,实际上外部函数返回了一个内部函数。 - Jurrian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接