js事件轮询机制

Q:js为什么是单线程?

A:如果前一秒对dom元素进行了删除操作,下一秒又对该元素进行了赋值,如果是多线程的话,浏览器在解析的时候不知道该怎么处理,单线程就不会出现这种歧异。(以上观点是个人理解哈,可能底层的设计有其他的考虑),既然是单线程就会出现另一个问题,每次只能执行一个任务,如果某个任务卡住了,剩下的都无法继续执行了,所以呢,异步任务就是用来解决这种情况的。

举个例子:

js的单线程——>每条车道只允许同时通过一辆汽车(JS主线程每次只能同时执行一个任务),假如3号车突然坏掉了,又只有这一条车道,那么剩余的车只能被堵在后面(这就是同步存在的问题)
在这里插入图片描述
如果此时启用车道2,把3号车推到我们的应急车道—车道2,等3号车修好以后,车道1刚好没有车驶入,空闲中,再让他让他回到正常车道—车道1,就不会造成堵车了。(这就是异步操作,把异步的方法先放到事件队列中(应急车道)等待执行,等主线程中的所有任务都执行完毕后,即主线程处于空闲中的状态时,再把事件队列中的程序推入主线程开始执行
在这里插入图片描述

以下代码输入结果为 2 3 1(new Promise为同步方法,放入主线程第一位,log(3)为同步,放入主线程第二位,setTimeOut为异步,放入事件队列等待执行)
		setTimeout(function(){
			console.log(1)
		})
		new Promise ( function () {
			console.log(2)
		})
		console.log(3)
		
		PS:异步:setTimeOut		setInterval		.then()回调函数,ajax请求等
     	   同步:script标签包裹的非异步代码均为同步代码,从上到下依次执行

Q:宏任务和微任务

异步方法需要被放到事件队列中等待执行,异步方法又分为宏任务和微任务区别就是微任务执行优先级高于宏任务

例子:3号车(宏任务)坏了以后,5号车(微任务)又坏了,两车都修好以后按照常理应该是3号车先走然后是5号车,但是5号车属于特种车辆(即微任务),所以拥有优先行使权,所以5号车先走,3号车后走。(即在事件队列中会优先执行所以的微任务,然后再去执行宏任务)
ps:宏任务:setTimeout, setInterval, setImmediate, I/O, UI rendering
微任务:process.nextTick(nodeJS), Promises的.then()回调, Object.observe(废弃), MutationObserver

在这里插入图片描述

代码:输出结果 2 3 4 1
		setTimeout(function(){
			console.log(1)
		})
		let temp =new Promise ( function (res,rej) {
			res()
			console.log(2)
		})
		console.log(3)
		temp.then(
			console.log(4)
		)
解析:
1·setTimeOut()是异步 ——>放到事件队列(属于宏任务)
2·new Promise() 是同步——>放到主线程 第一位
3·console.log(3) 是同步——>放到主线程 第二位
4· .then()是异步放到事件队列 (属于微任务)
所以执行顺序为: 2——>3——>4——>1

总结:JS是单线程,主线程一次同时只能执行一个任务,同步方法会从上到下依次执行,如遇到异步方法会先将其推到事件队列中等待,直到主线程空闲时,才会把事件队列中等待执行的方法推到主线程依次执行,异步方法又分为宏任务和微任务两种,在事件队列开始执行时,微任务的优先级会高于宏任务,往复循环直到所有任务都执行完毕。

以上分析 如果有不对的地方欢迎各位留言指教

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
浏览器的事件轮询机制是指浏览器在等待事件发生时,采用轮询的方式来检查是否有事件发生。这个机制是浏览器实现异步编程的重要手段之一。在浏览器中,事件可以是用户交互、网络请求、定时器等等。浏览器通过事件队列来管理这些事件,当事件发生时,会将事件加入到事件队列中,然后等待 JavaScript 引擎行。 事件轮询机制的实现方式是通过一个事件循环来实现的。事件循环会不断地从事件队列中取出事件,然后行相应的回调函数。当事件队列为空时,事件循环会进入休眠状态,等待新的事件加入到事件队列中。这个过程是不断重复的,直到浏览器关闭。 在事件轮询机制中,有一个重要的概念叫做“任务队列”。任务队列是一个存放任务的队列,每个任务都是一个回调函数。当事件发生时,会将相应的回调函数加入到任务队列中。任务队列分为两种类型:宏任务和微任务。宏任务包括用户交互、网络请求、定时器等等,而微任务则是指 Promise 的回调函数、MutationObserver 的回调函数等等。 在事件轮询机制中,宏任务和微任务的顺序是不同的。当一个宏任务行完毕后,会立即行所有的微任务,然后再行下一个宏任务。这个过程是不断重复的,直到事件队列为空。 总的来说,浏览器的事件轮询机制是一种非常重要的机制,它可以帮助我们实现异步编程,提高程序的性能和用户体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值