Обратный вызов также известен как функция высшего порядка?

Я пытаюсь понять функции обратного вызова и функции более высокого порядка, но есть описание из поста в блоге, " Поймите функции обратного вызова JavaScript и используйте их", которое меня смущает, подразумевается, что они одно и то же:

Функция обратного вызова, также известная как функция высшего порядка,...

Это было повторено дословно в ответе Quora на вопрос о том, что такое простое объяснение функций и обратных вызовов более высокого порядка в JavaScript?,

Это не имеет смысла для меня. Из того, что я понимаю, функция более высокого порядка принимает или возвращает другие функции, а функция обратного вызова - это передаваемая / принимаемая функция, так как же это может быть одновременно в обоих случаях? Есть что-то, чего я не понимаю в этом описании?

3 ответа

Решение

Функция обратного вызова

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

Вернуть функцию

Функция, которая возвращает функцию под названием Функция высшего порядка

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

Простой обратный вызов:

function toto(callback){
  /** some routine or action before */
  callback();
}

function foo(){
  console.log("I'm a simple callback");
}

toto(foo);

Простая функция высшего порядка

function toto(){
  console.log("I'm a simple Higher-Order Function")
  return function(){
     console.log("I'm the return function");
  }
}

//first log
const func = toto();
//second log
func();

Обратный вызов, который также является функцией высшего порядка:

function toto(callback){
  /** some routine or action before */
  const func = callback();
  func();
}

function foo(){
  console.log("I'm a callback and Higher-Order function");
  
  return function(){
    console.log("Do something...");
  };
}

toto(foo);

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

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

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

    public static IEnumerable<T> OrderByProperty<T>(this IEnumerable<T> items, Func<T, object> selector)
    {
        return items.Select(x => new { o = selector(x), item = x })
                    .OrderBy(x => x.o)
                    .Select(x=> x.item);
    }

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

    var orderedByA = Enumerable.Range(0, 100)
          .Select(x=> new Item{
            A = x,
            B = 100 - x
          })
          .OrderByProperty(x => x.A);

С другой стороны, обратные вызовы могут использоваться для продолжения потока приложения, когда требуется некоторое асинхронное или длинное действие, например

void FirstAsync(){
    Task.Run(()=>{
        Thread.Sleep(1000);
        Console.WriteLine("First executed");
    });
}

void Second()
{
    Console.WriteLine("Second executed");
}

void FirstV2(Action callback)
{
    Task.Run(() =>
    {
        Thread.Sleep(1000);
        Console.WriteLine("First executed");
        callback?.Invoke();
    });
}

void Main()
{
    FirstAsync();
    Second();
    Thread.Sleep(2000);
    FirstV2(Second);
}

Вывод программы выше будет такой:

Second executed
First executed
First executed
Second executed
Другие вопросы по тегам