一、单线程与多线程
单线程语言:JavaScript的设计就是为了处理浏览器网页的交互,决定了它是一门单线程语言。
JavaScript是单线程的,那么处理任务就是一件接着一件处理,从上往下顺序执行。
console.log('script start')
console.log('do something...')
console.log('script end')
// script start
// do something...
// script end
复制代码
如果一个任务的处理耗时需要等待很久,那么后面的任务也就会被阻塞,会带来极不友好的体验,但是:
console.log('script start')
console.log('do something...')
setTimeout(() => {
console.log('timer over')
}, 1000)
// 点击页面
console.log('click page')
console.log('script end')
// script start
// do something...
// click page
// script end
// timer
复制代码
其实,JavaScript 单线程指的是浏览器中负责解释和执行 JavaScript 代码的只有一个线程,即为JS引擎线程,但是浏览器的渲染进程是提供多个线程的。
二、同步任务与异步任务
同步任务:在函数返回时就能得到预期结果。
console.log('Hello');
复制代码
异步任务:在函数返回的时候不能得到预期结果。
fs.readFile('test.txt', 'utf8', function(err, data) {
console.log(data);
});
复制代码
三、宏任务与微任务
宏任务:
- script(整体代码)
- setTimeout, setInterval, setImmediate,
- I/O
- UI 渲染
ajax请求不属于宏任务,js线程遇到ajax请求,会将请求交给对应的http线程处理,一旦请求返回结果,就会将对应的回调放入宏任务队列,等请求完成执行。
微任务:
- process.nextTick
- Promise
- Object.observe(已废弃)
- MutationObserver(html5新特性)
四、事件循环
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END