Как работает функция, возвращающая другую функцию, которая принимает другой аргумент? - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть функция из курса редукса Дана Абрамова.Он сохраняет данные, но возвращает функцию, принимающую действие в качестве аргумента.Я знаю clojures, но в функции мы не выполняли последнюю функцию.Функция addLoggingToDispatch не имеет аргумента действия, как эта функция работает?

     const addLoggingToDispatch = (store) => {
     const rawDispatch = store.dispatch;

      return (action) => {
       console.group(action.type);
       console.log('%c prev state', 'color: gray', store.getState());
       console.log('%c action', 'color: blue', action);
       const returnValue = rawDispatch(action);
       console.log('%c next state', 'color: green', store.getState());
       console.groupEnd(action.type);
       return returnValue;
      };
     };

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Похоже, эта функция предназначена для замены или переноса метода dispatch, который поставляется с вашим магазином.Метод dispatch принимает действие в качестве аргумента, поэтому он имеет ту же сигнатуру, что и ваша возвращаемая функция.Поэтому, где бы вы ни создавали магазин, делайте что-то вроде этого:

const store = createStore()
store.dispatch = addLoggingToStore(store)

Вы можете уточнить этот пост, показав нам, где вы на самом деле используете addLoggingToStore.Но если я правильно понимаю, эта функция этой функции состоит в том, чтобы запекать функциональность регистрации без создания какого-либо дополнительного промежуточного программного обеспечения регистрации.Теперь всякий раз, когда вы вызываете dispatch(someAction), он запускает вашу функцию вместо значения по умолчанию, предоставленного хранилищем приставок.

0 голосов
/ 28 декабря 2018

Функция, которую addLoggingToDispatch возвращает , закрывает параметр store.Затем, когда эта функция вызывается, ей передается аргумент для action.Поэтому, когда эта возвращаемая функция выполняется, она имеет доступ к action (потому что это один из ее параметров) и store (потому что она закрывается над параметром addLoggingToDispatch).

Когда функция создается внутри другой функции, и внутренняя функция продолжает существовать после возврата внешней функции (потому что внешняя функция возвращает ее или она была добавлена ​​в список функций, таких как список обработчиков событий и т. Д.),внутренняя функция имеет постоянную ссылку на контекст, в котором она была создана (вызов внешней функции) и все параметры / переменные в этом контексте (store, в этом примере).

Вот более простой пример:

function createAdderFunction(a) {
  return function(b) {
    return a + b;
  };
}

var addFive = createAdderFunction(5);
// Now, `addFive` is a function that will add 5 to whatever you call it with
console.log(addFive(2));  // 7
console.log(addFive(37)); // 42

var addTen = createAdderFunction(10);
// And `addTen` is a function that will add 10 to whatever you call it with
console.log(addTen(15)); // 25

// `addFive` and `addTen` are separate from each other and work independently
console.log(addFive(0)); // 5
console.log(addTen(0));  // 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...