调用函数和回调函数有什么区别?

时间:2015-03-13 09:15:43

标签: javascript node.js

以下代码段之间有什么区别

// calling a function
function execute(){
}
function fn(){
  asynchronousFunction(function(){
    execute();
   })
}
fn();

以下代码段如何与上述不同

// callback a function
function execute(){
}
function fn(done){
  asynchronousFunction(function(){
    done();
   })
}
fn(execute);

回调与直接调用函数的方式不同?每种方法的利弊是什么?

4 个答案:

答案 0 :(得分:2)

如果你调用一个函数,它会立即执行。

如果将函数作为参数传递给另一个函数,那么其他一些代码稍后会调用它(此时它将执行)。

他们做同样的事情并不是不同的方法。当你编写一个需要在某个时候做某事的函数时,你会使用一个回调,但当这个函数取决于函数之外的东西时。

经典的例子是addEventListener。为了便于讨论,我们仅限于点击事件。您有一个标准功能,用于在点击某些内容时发生某些事情。许多程序希望在点击某些内容时发生某些事情,但这些事情几乎可以是任何事情。

答案 1 :(得分:0)

在第一种情况下,函数fn()可以看到execute()并且参数是可选的,因为无论何时调用fn()都将被称为execute()。

在第二种情况下,你使你的功能更多"一般"并且您可以自定义回调函数

答案 2 :(得分:0)

第一个选项将fn显示为一个简单的函数,它启动某种异步操作,并且不向外部提供任何其他信息。如果fn类似于uploadData,那么您将拥有一个尝试上传它的简单函数(如果失败则可能会显示错误消息,或者如果失败则显示成功消息)已完成),但调用者只能启动它而不做任何其他事情。

第二个选项还允许fn的调用者决定fn完成时应该发生什么。因此,如果fnuploadData,则调用者还可以指定数据上传后应发生的情况(或者是否存在错误)。

答案 3 :(得分:0)

这些回调为您提供了很大的灵活性。在第二个示例中,您可以说:“执行fn(),执行异步功能,如果已完成,则调用done()。”关键是,您可以决定done()的作用,尽管您对调用它的方法没有任何了解。

提供作为参数的函数,例如要执行的函数。在开始,结束或其他事件,是一个基本原则。它是钩子,回调,承诺,复杂对象配置等的基础。