面试复习:事件循环(event loop)

一、单线程与多线程

单线程语言: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
喜欢就支持一下吧
点赞0 分享