js是单线程还是多线程?

1,445 阅读1分钟

首先,我很明确地告诉你,js执行是单线程的

那么,为什么js要用单线程模式, 而不用多线程模式?

  • JavaScript的单线程,与它的用途有关。
  • 作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。
  • 这决定了它只能是单线程,否则会带来很复杂的同步问题

如何证明js执行是单线程的?只需证明如下两点

1.setTimeout()的回调函数是在主线程执行的

2.定时器回调函数只有在运行栈中的代码(也就是初始化代码)全部执行完后才有可能执行

代码示例如下:

 setTimeout(function () {
    console.log('timeout 2222')
    alert('22222222')
  }, 2000)
  setTimeout(function () {
    console.log('timeout 1111')
    alert('1111111')
  }, 1000)
  setTimeout(function () {
    console.log('timeout() 00000')
  }, 0)
  function fn() {
    console.log('fn()')
  }
  fn()

  console.log('alert()之前')
  alert('------') //暂停当前主线程的执行, 同时暂停计时, 点击确定后, 恢复程序执行和计时
  console.log('alert()之后')

也就是说,js是先执行完初始化代码,然后从回调队列中一依次将回调函数放入主线程执行,所以,js执行代码是单线程的。

大家可以自行复制代码去验证