我有点困惑,不是关于回调的用途,而是因为我看到在场景中使用的回调通常似乎将函数作为参数传递给另一个函数是不必要的,因为你可以在当前函数中的代码执行完毕后调用您想要调用的函数。例如:
function hello( a , b ) {
var result = a + b;
myFunction();
}
myFunction() {
//code
}
hello(1,2);
令人困惑的是,我已经看过许多例子,其中回调在一个场景中被使用,就像我写的第一个代码一样简单,在我看来回调不是' t需要:
function hello(a, b, callback) {
var result = a + b;
callback();
}
myFunction() {
//code
}
hello(1, 2, myFunction);
我在那里使用了一个回调但是我可以在代码执行后调用函数myFunction
而不传递myFunction
作为参数。我理解一个框架或库在代码完成执行后不知道你想要调用的函数的名称,所以将你想要的函数稍后作为参数传递似乎有意义但是当你知道在函数中执行任何代码之后要调用的函数的名称,为什么不像我在第一个示例中那样调用它?我很感激你的帮助。感谢
答案 0 :(得分:7)
收益1
回调很好的一个原因是你可以用任何回调来调用你的函数:
hello(1, 2, myFunction1);
hello(1, 2, myFunction2);
...
hello(1, 2, anyFunctionAtAll);
如果没有将回调作为参数传递的可能性,那么hello
将始终执行myFunction,因为它已修复在您的功能代码上。
收益2
另一个原因是,使用回调可以防止长时间运行的阻塞。在函数操作完成后传递一个回调来运行,在处理它时,它会控制回主事件循环而不是阻塞。
例如,如果您要执行这些操作:
hello(1, 2, myCallback);
console.log('Im not waiting for hello!')
如果你的myCallback
函数花费太多时间处理,控制台操作不会等待它终止执行。
如果您想了解更多,了解任何其他javascript警告,我建议this和this
<强>结论强>
如果您认为自己没有从中获益,那么您的方案就不需要回调。
答案 1 :(得分:0)
上面给出的示例并不是回调的一个很好的用例,即imo。您通常不希望在程序上简单地执行回调函数,您希望该回调函数指示传递给它的包含函数的行为。这样,包含函数可以根据其给定的上下文/状态而表现不同。
以下是一个例子:
function modifyArray(array, callback) {
var modifiedArray = [];
for (var i = 0; i < array.length, i++) {
modifiedArray.push(callback(array[i]));
}
return modifiedArray;
}
注意回调函数是如何简单执行的?它实际上决定了包含函数修改参数数组元素的方式。
通过这种方式,您可以编写高度灵活的函数,可以在整个代码库中重复使用。
答案 2 :(得分:0)
可以使用它的一个原因是您可以将myFunction
作为匿名函数来调用
function hello( a , b, callback ) {
var result = a + b;
callback();
}
hello(1,2, function() {
// your stuff here
});
第二个原因是,如果您使用第三方API,例如您向端点发出API请求并等待响应?
$.get('api/some/url', function() {
// This is your callback that get function provides you
})
或者也许您正在使用某些库,例如jquery
$("p").hide("slow", function(){
// Callback that will be executed after.
});