首先,我很明确地告诉你,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执行代码是单线程的。
大家可以自行复制代码去验证