一、简述。
这也是在研究js运行机制拓展开,也算是对以前知识的一个review和总结。
如果有听说过js的异步任务的话,肯定会想到的js的异步编程,其中回调函数就是其中一个典型的异步设计模式。如果有看过jquery源码的童鞋,可以很清晰看到不少地方是有很多的回调函数的。具体关于异步编程可以参照阮一峰老师的💡《Javascript异步编程的4种方法》 这是一个链接!
二、定义和demo。
🛎回调函数 :a函数作为参数传进b函数里,且被b函数调用,则a函数被成为 ‘回调函数’;
📍回调函数其实也可以说是在运行当前函数,也就是b函数的时候,操作系统把a函数给挂起了,当等待其他事件完成(或者触发到a函数的时候),a函数才会被执行。
❓Q1:那回调函数是可以被异步函数调用,那么只能存在异步函数里?能不能被同步函数调用?关于其中的阻塞和非阻塞的情况又是怎么样的?
关于回调函数,也说了其实是一个设计模式,只是设计成a函数可以作为b函数的参数,从而方便b函数调用。因此,回调函数既可以被同步函数调用,也可以被异步函数调用,但是还是所有区别的:
在同步调用回调函数的时候,回调函数是最后执行的;
在异步调用回调函数里,回调函数可以被执行,也可以不被执行(当条件没有被触发时)
其中,回调函数被同步调用肯定是阻塞的,被异步调用的话,在我看来是分情况讨论的,但是一般情况下
异步调用回调函数的情况:
1、当事件没有被触发的时候;假如使用ajax调用回调函数,如果type类型没写对的话,换句话就是触发条件不成功,那么回调事件是不会没调用的;
2、当事件被触发的时候;一般情况下,异步的回调函数的条件都会没触发,例如使用定时器就是一个经典的例子,无论是setTimeout或者setInterval都是会被触发;
下面就是编写的几个demo,互相会有一些对比,下面会有说明,图片里也有一些注释。
demo1:同步调用回调函数。
demo2:同步回调函数 VS 同步函数间调用;
test1.js 这是个回调函数;是阻塞的;
test1_com.js 1.这不是回调函数;这只是单纯的函数之间的调用;是阻塞的;
demo3:异步调用回调函数
demo4:同步回调函数 VS 同步函数间调用 VS 异步调用回调函数
3者的一些对比都卸载图片上了,可以放大图片对比一下;
这里就不做累赘的讲解了。
拓展:回调地狱(callback hell)
回调地狱:就是在函数里不断去嵌套回调函数的做法,这样写代码是高糅合的,嗨难懂,后期维护很难;
下面是一个简单的嵌套回调函数demo:
可能你看了上面这个demo,觉得没什么,好吧上面是嵌套3层的,接下来是经典的回调地狱
这样的很多的一个})
,造成了开发人员不容易去理解和编写代码的,所以有了Promise等等的一些方法去解决这些回调地狱的出现。
关于回调地狱的原文请参考:
回调地狱
💡这是一个链接哈~
觉得不错的就点个赞呗!
如果哪个地方错误了欢迎指出,可以发邮件或者发简书私信,可以微信私聊哈~