【js执行机制】

1.浏览器常驻的线程
(1)js引擎线程(解释执行js代码、用户输入、网络请求)
(2)GUI线程(绘制用户界面、与js主线程是互斥的)
(3)http网络请求线程(处理用户的get和post请求,等返回结果后将回调函数推入任务队列)
(4)定时触发线程(setTIMEOUT,setinterval等大事件结束后,把执行函数推入任务队列中,)
(5)浏览器事件处理线程(将click,mouse等交互事件发生后将这些事件放入事件队列)
2.js引擎线程和GUI线程-----互斥
(6)Js可以操作dom元素,近而会影响到GUI的渲染结果,因此js引擎线程与GUI渲染线程是互斥的,也就是说当js引擎线程处于运行状态时,GUI线程将处于冻结状态。
3.js执行机制 ---- 单线程
(7)单线程,同一时间只能做一件事情。
4.js执行机制----多线程不好吗?
(8)Js设计出来就是为了与用户交互,处理dom,假如js是多线程,同一时间一个线程想修改dom,另一个线程想要伸出dom,问题就变得复杂很多,浏览器不知道听谁的,如果引入“锁”的机制,这不就又回到被其他语言尴尬的困境了吗?
Js执行机制
(9)Javascript是基于单线程运行的,同时又是可以异步执行的,一般来说这种既是单线程又是异步的语言都是基于时间驱动的。恰好浏览器就给JavaScript提供了这么一个环境(event loop 事件循环)
(10)执行栈相当于js线程里面的主线程。
重新理解定时器
(11)SetTimeout的等待时间结束后并不是直接执行而是先推入浏览器的一个任务队列,在同步队列结束后再一次调用任务队列中的任务。
(12)SetTimeout(function(){},0),js主线程执行栈为空时,0毫秒实际上也达不到的,根据html标准,最低4毫秒。
(13)Setinterval是每隔一段时间把任务放到event loop 里面。
(14)所以,定时器不准。定时器不准,定时器不准。

	var starttime = +new Date();

			function foo(a) {
				for (var i = 0; i < a; i++) {
					console.log(i)
				}
			}
			console.log(starttime)
			setTimeout(function() {
				console.log(+new Date() - starttime)
			}, 400)
			foo(100000);
			console.log("helloworld")

在这里插入图片描述
发现延迟了一千多毫秒才执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值