Проще говоря, в чем разница между преобразователем и функцией высшего порядка?

Я понимаю, что обе функции возвращают функции.

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

Замыкание — это реализация функции высокого порядка (HOF) для создания новой области видимости для приватных переменных... верно? Другие примеры HOF включают map, reduce и filter.

Есть ли что-то еще, что явно определяет разницу между ними?

Спасибо.


person bloppit    schedule 17.07.2017    source источник
comment
Функции высшего порядка — это функции, которые принимают другую функцию в качестве аргумента. Неважно, что они возвращают. Преобразователь вообще не принимает никаких аргументов. Он просто откладывает вычисление выражения и возвращает результат этого выражения при вызове.   -  person    schedule 17.07.2017


Ответы (2)


Я понимаю, что обе функции возвращают функции

Ваше понимание немного неверно

  • Thunks могут возвращать значение любого типа, а не только типа Function.
  • Функции высшего порядка могут возвращать значение любого типа, а не только типа Function.

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

Преобразователи (и функции более высокого порядка, если уж на то пошло) не связаны неразрывно с какой-либо конкретной библиотекой (React, Redux) или каким-либо конкретным потоком управления (синхронизация, асинхронность). Преобразователь — это просто нулевая функция — они имеют множество распространенных вариантов использования, но чаще всего используются для задержки оценки конкретного вычисления.

Замыкание — это реализация функции высокого порядка (HOF) для создания новой области видимости для приватных переменных... верно? Другие примеры HOF включают отображение, уменьшение и фильтрацию.

замыкание не обязательно является реализацией функции более высокого порядка. Ключевое слово function (и синтаксис стрелочной функции =>) действительно создает замыкание, которое имеет новую (лексическую) область действия, да.

Есть ли что-то еще, что явно определяет разницу между ними?

Да. Чем они похожи:

  • они обе функции
  • они оба могут возвращать значения любого типа

Чем они отличаются:

  • thunks - нулевые функции (они не принимают аргументов)
  • функции высшего порядка принимают функцию в качестве аргумента и/или возвращают функцию

Возможно, самое важное различие:

  • Преобразователь может только считаться функцией высшего порядка, если он возвращает функцию.
person Mulan    schedule 17.07.2017

Преобразователи — это функции, оборачивающие выражения, чтобы задержать их вычисление.

Эта задержка достигается в Redux thunk a, когда вызывается действие, оно возвращает функцию. Эта возвращенная функция может быть вызвана позднее.

Вот пример действия thunk.

function incrementAsync() {
  // the below function is called by Redux Thunk middleware below.
  return dispatch => {
    setTimeout(() => {
      // Yay! Can invoke sync or async actions with `dispatch`
      dispatch(increment());
    }, 1000);
  };

Функция высшего порядка — это просто функция, которая либо возвращает функцию, либо принимает функцию в качестве одного из своих аргументов. Поскольку эта функция возвращает другую функцию, которая принимает отправку в качестве аргумента, это пример функции более высокого порядка.

Код промежуточного программного обеспечения redux thunk выглядит следующим образом:

function createThunkMiddleware() {
  return store => next => action => {
    if (typeof action === 'function') {

      // since action is a function it is a thunk action creator
      // so call it with store methods
      return action(store.dispatch, store.getState);

    }
    // action is not a function so redux thunk ignores it
    return next(action);
  };
}

Как только вызывается наш создатель thunk действий, он отправляет функцию действия через цепочку промежуточного программного обеспечения. Когда оно достигает нашего промежуточного программного обеспечения thunk, это действие распознается как функция и, следовательно, вызывается снова с помощью методов dispatch и getState хранилища.

Из-за этого второго вызова функции мы теперь находимся в области действия функции, возвращаемой нашим создателем действия thunk. Это означает, что теперь мы можем выполнять асинхронную логику и по-прежнему иметь доступ к методам getState и диспетчеризации хранилища. Вот почему наш создатель действия thunk можно считать выражением thunk. Используя функцию более высокого порядка, мы можем получить доступ, но отложить использование метода отправки или getState хранилища на будущее. Как видно ниже, действие увеличения вызывается с задержкой в ​​одну секунду.

function incrementAsync() {
  // the below function is called by Redux Thunk middleware below.
  return dispatch => {
    setTimeout(() => {
      // Yay! Can invoke sync or async actions with `dispatch`
      dispatch(increment());
    }, 1000);
  };
person therewillbecode    schedule 17.07.2017
comment
Спасибо @therewillbecode. Уместно ли говорить, что все преобразователи являются функциями более высокого порядка, но не все функции более высокого порядка являются преобразователями? - person bloppit; 17.07.2017
comment
@bloppit да, преобразователи - это всего лишь один пример функций более высокого порядка, которые используются почти как функция обратного вызова, которая была создана (возвращена) другой функцией. - person Raja Rao; 01.09.2017