JS是单线程执行

  • Post author:
  • Post category:其他




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* 这决定了它只能是单线程,否则会带来很复杂的同步问题

	  例如如果有多个线程AB,同时操作同一个dom元素,A线程是更新dom,B线程是删除dom,当A准备更新时
	  时间片切换到B,这时B将dom删除了,然后时间片切回AA就没法更新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 版权协议,转载请附上原文出处链接和本声明。