JavaScript中,JavaScript是单线程,单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。于是就有一个概念——任务队列。但是如果一直这样等着排队执行任务,非得等一个任务完成再执行下一个任务,这样就会造成资源浪费,所以就有了同步任务和异步任务。
- 同步任务
就是在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务; - 异步任务
不进入主线程、而进入"任务队列"(task queue)的任务,只有等主线程任务执行完毕,"任务队列"开始通知主线程,请求执行任务,该任务才会进入主线程执行;
通俗地讲,就是不等结果直接进行下一步,那怎么拿到结果呢,利用回调即可拿到异步的结果
下面用一个通俗的事例来讲讲同步与异步
A:让黄牛去买票,然后我搁边上站着等(这是同步任务)
B:让黄牛去买票(告诉黄牛,你买到票call我),然后我去做其他事情(这是异步任务,括号里表示的是回调)
- 回调call back
回调是拿到异步结果的一种方式,当然回调也可以拿到同步的结果
function fn1(){
setTimeout(function(){
console.log("异步做事")
},1000)
}
function fn2(){
console.log("同步做事")
}
fn1()
console.log(1)//先打印出1,再打印出“异步做事”,因为fn1是异步函数,不等函数结果出来,直接运行下面的代码
fn2()
console.log(1)//先打印出“同步做事”,再打印出1,因为fn2是同步函数,会等函数运行完,结果出来,再运行下面的代码
至此,同步、异步、回调都有了大致的了解了