什么是同步和异步
- 同步:所谓同步,就是前一个任务结束后再执行后一个任务,程序的执行顺序与任务的排列顺序是一致的、同步的。
- 异步:所谓异步,就是在做一件事件的同时,可以去处理其他的事情( 异步函数是setTimeout和setInterval )
执行机制
先看一个例子:
setTimeout('console.log("qqqq");',0)
setTimeout('console.log("6666");',1000)
console.log('hello')
console.log('javascript')
观察上面的运行结果,我们发现两个定时器都在前面,并且第一个是0毫秒执行,那不应该先输出吗,为什么反而在最后两行代码后执行呢?
首先,我们知道JavaScript的一个特点就是单线程,也就是说一个时间只能做一件事,文章开头也写到settimeout()是一个异步函数,现在就需要讲一下JavaScript的执行栈和任务队列了。
执行栈:整体代码的执行由上而下,编译一句,执行一句
任务队列:同步代码放到执行栈中执行,异步代码会先存放到任务队列中,执行栈代码先执行,异步代码在执行栈执行完后再执行
再看上面的例子就不难理解为什么是这样的执行结果了。
综上,总结一下JavaScript的执行机制:
- 先执行执行栈中的同步任务
- 异步任务(回调函数)放入任务队列中
- 一旦执行栈中的所有同步任务执行完毕,系统就会按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈,开始执行。
- 由于主线程不断的重复获得任务,执行任务,再获取任务,再执行,所以这种机制被称为“事件循环”(event loop)。
当然,JavaScript的异步问题不仅仅是settimeout()和setInterval()这两个异步函数,还有其他知识,后面会再补充。