有人可以解释一下,为什么我们在 JavaScript 中使用回调?我找到了例子,但它们可以通过使用普通函数来实现。使用它有什么好处?我得到了“如何”使用它的答案,而不是“为什么以及何时”我们需要使用它。
通常,我发现它被用于 AJAX。在 httpRequest.onreadystatechange
上。这和Java的多线程是不是很像?响应的侦听器如何以及在哪里?异步编程类似于多线程吗?
在下面的代码中,控制流程是怎样的:
function some_function(arg1, arg2, callback) {
var my_number = Math.ceil(Math.random() * (arg1 - arg2) + arg2);
callback(my_number);
some_different_function_not_callback(arg1);
}
some_function(5, 15, function(num) {
console.log("callback called! " + num);
});
来自 JQuery 网站:
回调的特殊之处在于,出现在“父级”之后的函数可以在回调执行之前执行”(参考: http ://docs.jquery.com/Tutorials:How_jQuery_Works)
有人可以用一个例子向我解释这一行吗?
原文由 Harke 发布,翻译遵循 CC BY-SA 4.0 许可协议
主浏览器进程是一个单线程事件循环。如果您在单线程事件循环中执行长时间运行的操作,则进程会“阻塞”。这很糟糕,因为进程在等待您的操作完成时停止处理其他事件。 ‘alert’ 是为数不多的阻塞浏览器的方法之一:如果您调用 alert(‘test’),您将无法再单击链接、执行 ajax 查询或与浏览器 UI 交互。
为了防止阻塞长时间运行的操作,XMLHttpRequest 提供了一个异步接口。您将回调传递给它以在操作完成后运行,并且在处理过程中将控制权交还给主事件循环而不是阻塞。
没有理由使用回调,除非您想将某些东西绑定到事件处理程序,或者您的操作可能会阻塞,因此需要异步编程接口。
这是一个很好的视频,更多地讨论了浏览器中使用的事件循环,以及 node.js 中服务器端的事件循环。
编辑:jQuery 文档中那条令人费解的行只是意味着回调异步执行,因为控制被交还给主事件循环。