JS是单线程执行的
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>04_JS是单线程的</title>
</head>
<body>
<!--
1. 如何证明js执行是单线程的?
* setTimeout()的回调函数是在主线程执行的
* 定时器回调函数只有在运行栈中的代码全部执行完后才有可能执行
2. 为什么js要用单线程模式, 而不用多线程模式?
* JavaScript的单线程,与它的用途有关。
* 作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。
* 这决定了它只能是单线程,否则会带来很复杂的同步问题
例如如果有多个线程A,B,同时操作同一个dom元素,A线程是更新dom,B线程是删除dom,当A准备更新时
时间片切换到B,这时B将dom删除了,然后时间片切回A,A就没法更新dom,虽然可以将线程的操作变为
原子操作,但是较为麻烦,因此JS操作dom的线程始终是单线程的。
3. 代码的分类:
* 初始化代码
* 回调代码
4. js引擎执行代码的基本流程
* 先执行初始化代码: 包含一些特别的代码 回调函数(异步执行)
* 设置定时器 定时器内部的回调函数不会执行,时间到后才会执行
* 绑定事件监听 事件绑定的回调函数不会执行,事件触发的时候才会执行
* 发送ajax请求
* 后面在某个时刻才会执行回调代码
-->
<script type="text/javascript">
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('------') //alert会暂停当前主线程的执行, 同时暂停计时, 点击确定后, 恢复程序执行和计时
console.log('alert()之后')
</script>
</body>
</html>
alert会暂停当前主线程的执行, 同时暂停计时, 点击确定后, 恢复程序执行和计时
异步执行:当初始化代码全部执行之后,才有可能执行的代码(如定时器中的函数,事件处理函数(有可能触发,那就执行,没触发就不会执行))
版权声明:本文为cjhxydream原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。