为了账号安全,请及时绑定邮箱和手机立即绑定

看了几十篇花里胡哨的文章,还是没弄清javascript里面的回调和异步到底有没有关系。

看了几十篇花里胡哨的文章,还是没弄清javascript里面的回调和异步到底有没有关系。

慕婉清6462132 2019-05-10 09:14:38
是在是不想拿别人文章里面的那种,写了n个参数,n堆执行语句的例子来提问。我自己写了三个简单的例子,例子里面包含了我对回调函数的理解和疑问。我看阮老师的文章也是,开门就说callback是异步编程的一种解决方案。可是我依然没弄明白之间有什么关系。//例1varcallback=function(num3){console.log('执行回调函数:'+num3)}functionfn(num1,num2,cb){varTotal=num1+num2;cb(Total);console.log('求和Total:'+Total)}fn(2,2,callback)执行结果://执行回调函数:4//求和Total:4//例2functionf2(){console.log('f2finished')}functionf1(cb){setTimeout(cb,0)//用setTimeout()模拟耗时操作console.log('f1finished')}f1(f2);执行结果://省略//例3functionf2(){setTimeout(()=>{console.log('f2finished')},0)}functionf1(cb){cb();console.log('f1finished')}f1(f2);执行结果://省略
查看完整描述

2 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

我也来尝试回答一下。
看了楼上那么多答案以及你的追问,我感觉你迷惑的地方在于你不了解“异步函数”和普通的“同步函数”之间到底有什么区别。
其实它们之间的主要区别在于“事件循环队列”,如果你是第一次听说这个词,可能会被吓到那么一下下,如果你并不是第一次听说,那么你可能是没有真正理解它以及它和异步函数之间的关系。
其实很简单,事件循环队列只是一个“待办事项清单”,注意是“待办”,而不是“立即办”。加入待办清单的是异步,没有加入待办清单的是同步。本质区别正在于此。
事件循环队列不直接向JS代码开放,所以我们不能直接操作它,只能通过间接的方法,主要有以下几种:
内置的定时器函数(setTimeout/clearTimeout、setInterval/clearInterval)
异步模式的Ajax请求
新创建的Promise对象
async函数(本质还是Promise)
以上4种都是异步的,除此之外的代码都是同步的(除非js以后加入了新的异步方式)。
比如说定时器,它会将一个函数放到事件队列中去,等到未来的某个时刻执行。即使传入的时间为0也是一样,所以下面的代码会先打印2再打印1:
setTimeout(()=>console.log(1),0);
console.log(2);
所以总结一下:
异步函数和同步函数之间的区别关键在于事件循环队列
并不是回调函数的使用使得一个函数成为异步函数,同步函数同样可以使用回调
js只有固定的几种方法可以创建异步函数,除此之外都是同步的
                            
查看完整回答
反对 回复 2019-05-10
  • 2 回答
  • 0 关注
  • 427 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信