Обратный вызов также известен как функция высшего порядка? - PullRequest
0 голосов
/ 21 января 2019

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 21 января 2019

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

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

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

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

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

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

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);
0 голосов
/ 22 января 2019

По моему мнению, функция более высокого порядка - это функция, которая берет другую функцию и использует ее для абстрагирования некоторого поведения, например, этот метод расширения 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
0 голосов
/ 21 января 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...