Обратный вызов также известен как функция высшего порядка?
Я пытаюсь понять функции обратного вызова и функции более высокого порядка, но есть описание из поста в блоге, " Поймите функции обратного вызова 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