一.什么是回调函数
按照MDN的描述:回调函数是一个函数,将会在另外一个函数执行完成后立即执行,回调函数是一个作为参数传给另一个JavaScript函数的函数。这个回调函数会在传给的函数内部执行。
二.为什么需要回调
客户端JavaScrpit在浏览器中运行,并且浏览器的主进程是单线程时间循环。如果我们尝试在单线程事件中执行长时间运作的操作,则会阻止该过程。从技术上讲这是不好的,因为过程在等待完成时停止处理其它事件。
例如.alert语句被视为浏览器 JavaScript中的阻止代码之一。如果运行alert,则在关闭alert对话框窗口之前,你将无法浏览器中进行任何交互。为了阻止阻塞长时间运行的操作,我们使用了回调。
三.例子
凉凉吃完饭,可以帮人带东西,也可以不帮别人带,但是饭是一定要吃的。
代码:
function liliang(task) {
console.log(`亮亮自己吃午饭`);
task()
}
liliang(
function () {
console.log(`帮然然买包子`);
}
)
以函数作为参数来进行传递,参数不写死的原因,可以委托更多人做。
四.JavaScript回调是异步的吗?
JavaScript被认为是单线程脚本语言,单线程是指Javascrpit 一次执行一个代码块。当Javascrpit忙于执行一个块时,它不可能移到下以一个块。
换句话说,我们可以认为Javascrpit代码本质上总是阻塞的。但是这种阻塞使我们无法在某些情况下编写代码,因为在这些情况下我们没有办法在执行某些特定的任务立即得到结果。
我谈论的任务包括以下情况:
1.通过API调用来获取数据。
2.通过发送网络请求从远程服务器获取一些资源。
为了处理这些情况,必须编写异步代码,而回调函数是处理这些情况的一种方法。所以从本质上说,回调函数是异步的。
五.关于回调地狱的问题
当多一个异步函数一个接一个地执行时,或产生回调地狱。
通过async函数来解决回调地狱的问题
async是ES7新出的特性,表明当前函数是异步函数,不会阻塞线程导致后续代码停止运行。
例子:
async function Fn() {
return 'hello world';
}
console.log(Fn());
返回的结果:
结论:
async 表示函数里有异步操作
await 表示紧跟在后面的表达式需要等待结果。
六.回调函数的好处
1.恰当时机发通知
2.让代码更加灵活
3.提高运行的效率
图示: