繁体   English   中英

回调是否也称为高阶函数?

[英]Is a callback also known as a higher-order function?

我正在尝试理解回调函数和高阶函数,但有一篇博客文章中的描述, 理解JavaScript回调函数和使用它们 ,这让我感到困惑,其含义是它们是同一个:

回调函数,也称为高阶函数,......

在Quora上逐字回答问题,询问有关JavaScript中高阶函数和回调的简单解释是什么?

这对我来说没有意义。 根据我的理解, 高阶函数接收或返回其他函数回调函数是传递/接收的函数 ,那么如何同时进行? 有什么东西我不理解这种描述吗?

回调函数

回调函数是作为参数传递给另一个函数的函数,然后在外部函数内调用该函数以完成某种例程或操作。

返回一个函数

返回称为高阶函数的函数的函数

回调函数不是高阶函数, 除非它是一个返回函数的函数。

简单的回调:

 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM