回调函数、同步回调&异步回调?同步任务&异步任务?

写在最前面,关于后面事件循环的部分,感觉之前的理解有点偏差,已经写在新的文章中了,可以具体查看关于事件循环的内容。

回调函数是一段可执行的代码块,它的作用是在需要的时候方便调用这段代码;
回调函数应用分为同步回调和异步回调。

一、同步回调

未用回调函数:
 

A();
B();


使用回调函数:
 

A(B);


二者效果相同,执行顺序都是先A(),再B()。效果看起来就是A执行完了再回头执行B,即回调函数(意义何在?还是按顺序写看起来方便易懂啊 = =)。当然如果嵌套多层回调函数,则会影响代码观看,形成“回调地狱”场景。

二、异步回调

回调函数多用于异步的场景,由此可以实现与同步书写代码不同的功能。(代码执行顺序变化)

同步任务&异步任务
 

A();
B();
C();


对于上述代码,若A 、B、C三个函数都是同步任务,则执行顺序就是A B C;若B是异步任务,则执行顺序要变成A C B。原因在于js的Event Loop(事件循环机制)。js是单线程,为了模仿多线程进行并发执行,js引擎划分除了两种内存空间,一种是可执行栈,用来存放同步任务(注意是栈,先进后出);另一种是任务队列,用来存放异步任务(注意时队列,先进先出)。遇到同步任务就放到可执行栈中,遇到异步任务就放到任务队列中,两个存储空间分别运行任务。不同的是,js本质还是单线程,不能真正并发同时输出两个内存空间中的结果,js总是要先执行同步任务,即要将可执行栈中的同步任务完成了之后才会执行异步任务。如此很像回调函数,类似:同步任务(异步任务)。但是有一点需注意,即任务队列中的异步任务是放进去就执行的,只不过不忙输出结果,而是要等同步任务都运行完了,这时直接拿任务队列中的异步结果,节约了时间。相当于,在同步任务们运行的时候,异步任务也没有干等着,他们也在计算运行,只不过没有输出结果,等同步任务完成了,异步任务多数情况下也完成好了,正好取出来,一份时间做两件事,所以不会阻塞。

例如:

A();
B();
C();


若B是一个耗时很长的动作,同步执行必然会阻塞C的运行,说不定C 1s就运行好了,但是B要运行10s,万一C后面还有其他耗时少的代码,更是影响代码执行效率。这时,将B变成异步任务,代码就会跳过B,执行后面的,正好后面的执行完了,B也运算出结果了,此时再运行它,没有耽搁时间,一直充分利用时间尽可能多做事。

异步任务不会在主线程执行的时候还会同时在分线程执行,因为只有Js引擎才能解析执行Js代码,只有同步代码执行完了执行栈中的代码,然后再去读取任务队列中的任务,挨个执行。异步代码本身还是需要js引擎花时间来执行的。

具体可看新发表的文章

说回回调函数,由于回调函数起作用是 在满足一定条件下才执行的,一定条件包括某段函数完成之后、某个事件触发、某段时间之后等,由此对应的应用场景分别是ajax请求、事件监听处理、setTimeout等方法。而这几个场景都是异步的,说明回调函数多用于异步场景,毕竟同步的意义不是很大,只是书写上变了点。回调函数只是一段可执行代码而已,先干什么,然后再回头调用什么,而这个执行顺序主要是由同步、异步的原理导致的,毕竟回调的思想我们都懂,不会搞混,复杂的是同步、异步的顺序而已。(异步还会细分为宏任务、微任务,导致更复杂,不方便判断代码执行顺序)

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值