是否需要将javascript回调函数作为参数传递?

是否需要将javascript回调函数作为参数传递?,javascript,callback,Javascript,Callback,到目前为止,在我阅读的所有内容中,回调函数都作为参数传递给其他函数: function mycallback(){ //dosomething } function mainfunc(mycallback){ //do something else mycallback(); } mainfunc(mycallback); 正如你所期望的那样,很好。我的问题是,是否需要将回调函数作为参数传递给mainfunc?如果你忽略这一点: function mycallbac

到目前为止,在我阅读的所有内容中,回调函数都作为参数传递给其他函数:

function mycallback(){
    //dosomething
}

function mainfunc(mycallback){
    //do something else
    mycallback();
}

mainfunc(mycallback);
正如你所期望的那样,很好。我的问题是,是否需要将回调函数作为参数传递给mainfunc?如果你忽略这一点:

function mycallback(){
    //dosomething
}

function mainfunc(){
    //do something else
    mycallback();
}

mainfunc();

它工作正常,与第一个示例相同。但我没有看到人们以这种方式使用回调。有什么原因吗?我遗漏了什么?

从技术上讲,是的,你可以像那样使用你的函数。将函数作为参数传递的原因与将任何内容作为参数传递的原因相同

mainfunc(eatSevenBurritos);
mainfunc(eatTwoChimichangas);
在某些情况下,你可能宁愿在通过mainfunc的时候吃7个墨西哥煎饼。也许在其他情况下,你宁愿在通过mainfunc的时候吃两个chimichangas

如果您总是要运行同一个函数,那么如果可以的话,请继续在其中编写代码。增加毫无意义的复杂性是没有意义的。但是如果你需要改变这种行为,你需要把它当作一个参数

mainfunc(eatSevenBurritos);
mainfunc(eatTwoChimichangas);

当人们谈论“第一类函数”时,这种行为就是他们的意思。能够将函数视为参数。因为行为是一种数据类型。

在执行异步任务时,最好使用回调

假设
mainfunc
是一个异步操作

  • 在第一个示例中,您向
    mainfunc
    传递了一个特定的回调。这使您可以灵活地让调用者分配操作后要执行的函数

  • 第二个示例,您硬编码了回调。除非您有这样做的理由,比如预定的后处理功能,否则这是不灵活的


如果您想要一个函数来处理所有回调,那么第二种方法可以很好地工作


通常,当您调用使用回调的方法时,您希望它在回调中执行不同的操作,具体取决于您调用它的时间和位置。您不必在一个回调函数中处理所有不同的情况(该函数必须知道它是哪种情况),只需针对每个特定情况使用一个回调函数即可。

您的第二个示例之所以有效,是因为
mycallback
存在于
mainfunc
的(一个)外部作用域中。通常情况并非如此。流行的模式是使用匿名回调函数。是否应始终调用相同的
mycallback
函数,还是存在多个回调函数?谢谢您的解释。我得到了一部分,但想不出任何情况下,我不能直接调用函数而不是回调。如果你能为这两种情况提供一些实际的例子,那就太好了。谢谢你的解释。我得到了一部分,但想不出任何情况下,我不能直接调用函数而不是回调。如果您能为这两种场景提供任何实用的示例,那就太好了。