看了几十篇花里胡哨的文章,还是没弄清javascript里面的回调和异步到底有没有关系。
是在是不想拿别人文章里面的那种,写了n个参数,n堆执行语句的例子来提问。
我自己写了三个简单的例子,例子里面包含了我对回调函数的理解和疑问。我看阮老师的文章也是,开门就说callback是异步编程的一种解决方案。可是我依然没弄明白之间有什么关系。
//例1
var callback = function(num3) {
console.log('执行回调函数:' + num3)
}
function fn(num1, num2, cb) {
var Total = num1 + num2;
cb(Total);
console.log('求和Total:' + Total)
}
fn(2, 2, callback)
执行结果:
//执行回调函数:4
//求和Total:4
//例2
function f2() {
console.log('f2 finished')
}
function f1(cb) {
setTimeout(cb,0) //用setTimeout()模拟耗时操作
console.log('f1 finished')
}
f1(f2);
执行结果:
//省略
//例3
function f2() {
setTimeout(()=>{
console.log('f2 finished')
},0)
}
function f1(cb) {
cb();
console.log('f1 finished')
}
f1(f2);
执行结果:
//省略
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
没有必然关系吧,只不过回调是处理异步的常用方式
setTime不管是0还是什么都会放入另一个队列,这是浏览器的行为。异步不异步js执行机制有规定的,浏览器内部就自己这样搞得
回调就是为了保证能够在某个条件达成的时候再去执行下一步
楼上说得很对。回调函数是异步API反馈主线程的一种方式,不是用来实现异步的。异步的典型实现方式是协程。
没明白这三个例子想表达什么,首先第一个例子跟异步没有关系,就是把函数作为参数传递而已,跟调用栈有关;第二个例子 setTimeout 是一个异步方法,会把传入的函数作为回调函数放进队列里;第三个例子同理。
首先 回调函数 其实就是一个普通的函数,和异步没什么关系;
其次 为什么回调什么老是和异步混一起出现, 主要是因为大家常用
回调函数
来接收异步操作的反馈(包括成功和出错);打个比方:
体育老师(主线程)给了学生一个电话(回函数)让学生去跑10圈(异步操作),和学生约定,跑完了(完成)再打他电话,跑的时候如果受伤了(出错)就直接打医务室的电话, 然后学生开始跑圈,老师吃干别的事去了.
我也来尝试回答一下。
看了楼上那么多答案以及你的追问,我感觉你迷惑的地方在于你不了解“异步函数”和普通的“同步函数”之间到底有什么区别。
其实它们之间的主要区别在于“事件循环队列”,如果你是第一次听说这个词,可能会被吓到那么一下下,如果你并不是第一次听说,那么你可能是没有真正理解它以及它和异步函数之间的关系。
其实很简单,事件循环队列只是一个“待办事项清单”,注意是“待办”,而不是“立即办”。加入待办清单的是异步,没有加入待办清单的是同步。本质区别正在于此。
事件循环队列不直接向JS代码开放,所以我们不能直接操作它,只能通过间接的方法,主要有以下几种:
以上4种都是异步的,除此之外的代码都是同步的(除非js以后加入了新的异步方式)。
比如说定时器,它会将一个函数放到事件队列中去,等到未来的某个时刻执行。即使传入的时间为0也是一样,所以下面的代码会先打印2再打印1:
所以总结一下: