我正在搜索回调函数,到目前为止我所理解的是回调函数是一个函数,它作为参数传递给另一个函数。
为什么要使用回叫功能?回叫功能有哪些优点?堆栈溢出和其他网站上有很多答案,但没有一个能帮助我理解回拨的真正优势。
答案 0 :(得分:2)
优点主要体现在异步功能上。
防止对脚本代码进行不必要的检查。
例如,使用ajax获取响应:
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
// things you want to perform after request is done.
};
xhttp.open("GET", url, true);
xhttp.send();
这样,您就不需要像使用setInterval(...)
那样持续检查请求是否已完成。
处理DOM事件。
所有DOM事件都需要处理回调,因为您无法预测何时会触发事件。
例如:
object.onclick=function(){// things you want to perform after the object is clicked};
创建可扩展的api或插件。例如:
var yourApi = function(passInCallback){
var args;
//do some common things...
passInCallback(args);
}
然后你的api用户可以在执行常用功能后执行不同的行为。
我现在能想到的全部内容。
答案 1 :(得分:1)
JavaScript只有一个执行线程。
JavaScript不会抢占正在运行的线程。
在调用堆栈清空之前,程序代码中的任何其他内容都无法运行。这称为"运行完成"。
因此,程序中运行的任何内容都会阻塞其他所有内容(字面意思是一切)。
因此,如果您有任何除了CPU以外的任何东西(如网络请求或等待用户),那么就CPU而言非常浪费,因为只需等待某些东西就可以阻止执行的线程即将发生。所以CPU闲置。
因此,JavaScript运行时提供了避免此方案的机制。它使功能以等待(如网络请求)异步为特征。
这意味着执行的JavaScript线程可以继续,而运行时会等待你。
您可以为这些异步函数提供回调以指定延续。即,当异步操作完成时,控制流应该从哪里开始。
当异步操作完成时,运行时会放置一个" Job"在"工作队列"运行时内部。
这些Jobs封装了函数指针(回调)和调用回调时使用的参数。
当调用堆栈下一个为空并且队列中的其他作业已完成时,作业将从作业队列中删除,并且实例化堆栈帧("执行上下文")并放置在叠加。
然后运行时从此堆栈帧开始执行。
有时这种行为包含在promise API中以使其更加方便,但机制是相同的。
setTimeout(callback, 2000);
document.write('Cool, I can do some stuff while the setTimeout is waiting.');
function callback() {
document.write('Hello from the callback.');
}