javascript es6双箭头函数

javascript es6双箭头函数,javascript,ecmascript-6,Javascript,Ecmascript 6,我想更好地理解es6箭头函数 给出以下示例: export default function applyMiddleware(...middlewares) { return (createStore) => (reducer, preloadedState, enhancer) => { // snip actual enhancer logic return { ...store,

我想更好地理解es6箭头函数

给出以下示例:

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

        return {
            ...store,
            dispatch
        }
    }
}
用文字描述上述内容:

  • 我们导出的函数(applyMiddleware)接受一个带有排列的数组参数
  • 然后,applyMiddleware返回一个带有createStore参数的无名函数,这次返回另一个带有三个参数的无名函数
  • 因此,如果没有箭头,它将如下所示:

    export default function applyMiddleware(...middlewares) {
      return function(createStore){
          return function(reducer,preloadedState,enhancer){
            //some logic
    
              return{...store,dispatch}
          }
        }
    }
    
    我的问题是:

  • 我说得对吗
  • 我们在这里看到的常见用例/代码范例是什么

  • 你的第一个问题的答案差不多(见我的评论)。第二个问题的答案是,您看到的模式是使用and的组合。导出函数的原始参数被收集到一个名为“middleware”的数组中,返回的函数关闭该数组(即有权访问)。然后可以使用另一个参数“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、下划线、ramda)都为您实现了curry,而不是手动使用curry函数来实现。使用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.
    

    这个答案适用于那些对双箭头功能仍有疑问的人。让我们深入研究一下

    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
    
    这就像是一个半执行的代码。如果你想完全执行它,你必须这样做

    ƒ (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);
        }
    }
    

    你会问什么?这不是数组参数的排列,而是将传递给该函数的参数聚集到一个数组中。很容易混淆,因为在函数调用(而不是定义)中应用于数组的同一个运算符具有相反的效果。为什么不通过babel运行此操作并查看输出?这回答了你的问题吗@不客气,当你第一次看到它们时,这些事情可能会很困难,但是一旦你习惯了它们,用没有良好支持的语言编写代码是很痛苦的。这个答案实际上更好地解释了外部函数返回内部函数的原因。