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

是在是不想拿别人文章里面的那种,写了n个参数,n堆执行语句的例子来提问。我自己写了三个简单的例子,例子里面包含了我对回调函数的理解和疑问。我看阮老师的文章也是,开门就说callback是异步编程的一种解决方案。可是我依然没弄明白之间有什么关系。
//例1
varcallback=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
//例2
functionf2(){
console.log('f2finished')
}
functionf1(cb){
setTimeout(cb,0)//用setTimeout()模拟耗时操作
console.log('f1finished')
}
f1(f2);
执行结果:
//省略
//例3
functionf2(){
setTimeout(()=>{
console.log('f2finished')
},0)
}
functionf1(cb){
cb();
console.log('f1finished')
}
f1(f2);
执行结果:
//省略
芜湖不芜
浏览 330回答 2
2回答

慕丝7291255

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

相关分类

JavaScript