以下代码段之间有什么区别
// calling a function
function execute(){
}
function fn(){
asynchronousFunction(function(){
execute();
})
}
fn();
以下代码段如何与上述不同
// callback a function
function execute(){
}
function fn(done){
asynchronousFunction(function(){
done();
})
}
fn(execute);
回调与直接调用函数的方式不同?每种方法的利弊是什么?
答案 0 :(得分:2)
如果你调用一个函数,它会立即执行。
如果将函数作为参数传递给另一个函数,那么其他一些代码稍后会调用它(此时它将执行)。
他们做同样的事情并不是不同的方法。当你编写一个需要在某个时候做某事的函数时,你会使用一个回调,但当这个函数取决于函数之外的东西时。
经典的例子是addEventListener
。为了便于讨论,我们仅限于点击事件。您有一个标准功能,用于在点击某些内容时发生某些事情。许多程序希望在点击某些内容时发生某些事情,但这些事情几乎可以是任何事情。
答案 1 :(得分:0)
在第一种情况下,函数fn()可以看到execute()并且参数是可选的,因为无论何时调用fn()都将被称为execute()。
在第二种情况下,你使你的功能更多"一般"并且您可以自定义回调函数
答案 2 :(得分:0)
第一个选项将fn
显示为一个简单的函数,它启动某种异步操作,并且不向外部提供任何其他信息。如果fn
类似于uploadData
,那么您将拥有一个尝试上传它的简单函数(如果失败则可能会显示错误消息,或者如果失败则显示成功消息)已完成),但调用者只能启动它而不做任何其他事情。
第二个选项还允许fn
的调用者决定fn
完成时应该发生什么。因此,如果fn
为uploadData
,则调用者还可以指定数据上传后应发生的情况(或者是否存在错误)。
答案 3 :(得分:0)
这些回调为您提供了很大的灵活性。在第二个示例中,您可以说:“执行fn()
,执行异步功能,如果已完成,则调用done()
。”关键是,您可以决定done()
的作用,尽管您对调用它的方法没有任何了解。
提供作为参数的函数,例如要执行的函数。在开始,结束或其他事件,是一个基本原则。它是钩子,回调,承诺,复杂对象配置等的基础。