JS 一大特点就是 单线程,即同一时间只能做一件事
单线程就意味着所有的任务需要排队,前一个任务结束后才会执行下一个任务。 这样可能造成的结果是:如果JS执行的时间过长,会导致页面的渲染不连贯,导致页面渲染加载阻塞的感觉
为了解决这个问题,JS出现了同步和异步
同步:前一个任务结束后才会执行下一个任务
异步:在处理一个任务的同时还可以执行其他任务
区别:在流水线上各个流程的执行顺序不同
console.log(1); window.setTimeout(function () { console.log(this); }, 1000); console.log(2);执行结果是 : 1 2 3
console.log(1); window.setTimeout(function () { console.log(this); }, 0); console.log(2);执行结果还是 : 1 2 3
这是因为JS 把任务分为了同步任务和异步任务
同步任务:同步任务都在主线上执行,形成一个执行栈异步任务:JS 的异步是通过回调函数实现的常见的回调函数有:
普通事件:click resize 等资源加载:load error 等定时器:setInterval setTimeout 等异步任务相关回调函数添加到任务队列中(任务队列也称为消息队列)
JS执行机制:
先执行执行栈中的同步任务
异步任务(回调函数)放入任务队列中
一旦执行栈中的所有同步任务执行完毕,系统就会按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈,开始执行。
由于主线程不断的重复获得任务,执行任务,再获取任务,再执行,所以这种机制被称为“事件循环”(event loop)。