в JavaScript ES6 в двойной функции стрелка

Я пытаюсь обернуть голову над некоторыми функциями стрелки, которые так распространены в react, и это инструменты.

приводит следующий пример:

    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. какова парадигма общего прецедента/кода, которую мы видим здесь?

1 ответов


ответ на ваш первый вопрос более или менее (см. Мой комментарий). Ответ на ваш второй вопрос заключается в том, что шаблон, который вы видите, это сочетание с помощью закрытие и карринг. Исходные параметры экспортируемой функции собираются в массив под названием "middlewares", который закрывают возвращаемые функции (т. е. имеют доступ). Затем функция может быть вызвана снова с еще одним параметром "createStore", тогда другая функция возвращается, что может принимать еще больше параметров. Это позволяет частично применить параметры. Для более тривиального (и, возможно, более понятного) примера возьмем функцию "add", которая добавляет два числа:

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

не очень интересно. Но давайте разберем его, чтобы он мог взять первое число и вернуть функцию, которая берет второе:

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

Это может показаться не большой победой для нашей функции добавления, но вы начали с много более разумный пример. Кроме того, вместо Карри вручную можно (и желательно) использовать функцию карри, которая делает это за вас, многие популярные библиотеки (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.