证明
setTimeout(function () {
console.log('timeout 2222')//8
alert('22222222')//9 暂停当前主线程的执行, 同时暂停计时, 点击确定后, 恢复程序执行和计时
}, 2000)
setTimeout(function () {
console.log('timeout 1111')//6
alert('1111111')//7 暂停当前主线程的执行, 同时暂停计时, 点击确定后, 恢复程序执行和计时
}, 1000)
setTimeout(function () {
console.log('timeout() 00000')//5
}, 0)
function fn() {
console.log('fn()')
}
fn()//1 初始化代码
console.log('alert()之前')//2 初始化代码
alert('------') //3 初始化代码 暂停当前主线程的执行, 同时暂停计时, 点击确定后, 恢复程序执行和计时
console.log('alert()之后')//4
暂停当前主线程的执行, 同时暂停计时, 点击确定后, 恢复程序执行和计时
代码的分类:
- 初始化代码
- 回调代码-回调函数是作为参数传递给另一个函数并在其父函数完成后执行的函数。
js引擎执行代码的基本流程
- 先执行初始化代码: 包含一些特别的代码 回调函数(异步执行)
- 设置定时器(定时器内部包含的回调函数后续执行)
- 绑定事件监听
- 发送ajax请求
- 后面在某个时刻才会执行回调代码
- setTimeout()的回调函数是在主线程执行的
- 定时器回调函数只有在运行栈中的代码全部执行完后才有可能执行
设计成单线程的原因
- JavaScript的单线程,与它的用途有关。
- 作为浏览器脚本语言,JavaScript的主要用途是与用户互动以及操作DOM。
- 这决定了它只能是单线程,否则会带来很复杂的同步问题