浏览器的进程
js从最基本上说是浏览器执行,浏览器不只执行js,还要执行很多其他的,浏览器有三个主进程
-
渲染进程(Renderer Process):负责网页的渲染,包括 HTML、CSS 和 JavaScript 的解析执行,以及页面布局和绘制等工作。
-
插件进程(Plugin Process):负责插件的运行,如 Flash 插件、视频播放插件等。
-
浏览器主进程(Browser Process):负责协调和控制整个浏览器的工作,包括页面的导航、标签页的管理、扩展程序的运行、插件的管理和垃圾回收等。
浏览器主进程是第一个,剩余的都是主进程调出来的,它可以调出来多个渲染进程,一个标签页对应一个进程。
js主要执行在渲染进程
而渲染进程不值管js,还有渲染,html,css,定时器,网络等等
所以他是怎么执行的呢
主要是渲染进程里有一个“人”一直在操作生产线上的代码,这个生产线就是队列
队列中包括渲染任务,定时任务,网络任务,点击事件任务等
为什么执行定时任务等时候不会阻塞?不是单线程吗
是因为定时任务等他不是自己盯着时间,而是交给其他线程模块进行计时,时间到了后,模块会把任务放到队列中,等待执行。
所以不会阻塞
其他的网络,点击事件等也是一样,不会立即执行,会被相应的模块放到队列中等待执行
ps:一些浏览器使用C或C++写的哦,比如某鸽
ps:添加事件等代码,是高速交互进程监督交互任务,发现后把任务放到消息队列里
ps:现在大部分浏览器都抛弃了只有两个队列(宏队列微队列)而是通过任务类型的优先级来执行,队列没有优先级,但是任务类型有。每个浏览器每个版本的优先级是不一样的,但还是有微队列。微队列最高优先级(也需要在执行完函数全局任务后)
ps:同一类型的任务要在一个队列哦
ps:主线程是先执行完函数全局任务再看其他队列和线程有没有任务,就是当前的所有任务,比如代码定时器一秒打印1,打印1这样的代码,会先打印完所有1在执行定时器的打印
ps:Promise是微队列
ps:为了理解,可以理解为其他进程也有队列,主进程会执行主队列。其他进程按照优先级添加任务到主队列执行
请记住:
1事件循环是异步的执行方式
2单线程是异步产生的主要原因
重点:
1.事件循环:
事件循环又叫做消息循环在Chrome的源码中每次循环从消息队列中取出第任务执行,而其他线程只需要在合适的过去把消息队列简单分为宏队法满定复杂的浏览器环境,取而代之的是一种更加是活客变的处理方式
根据W3C官方的解释每个任务有不同的类型問类型的任多必須在同不同的任务可以属子不同的队列。不同任务队列有不同的优先级在一次事件循环中由浏览器自行决定取哪一个队列的任务。
但浏览器必须有一个微队列,微队列的任务一定具有最高的优先级,必须优先调度执行
2.JS中的计时器能做到精确计时吗
不行,因为:
1 .计算机硬件没有原子钟,硬件无法做到.
2.操作系统的计时函数本身就有少量偏差,操作系统计时器不同有少量偏差,js用的是操作系统的函数也就携带了这些偏差
3 .按照W3C的标准浏览器实现计时器时,如果嵌套层级超过5层,则会带有4毫秒的最少在计时时间少于4豪秒时又带来了偏差
4.受事件循环的影响,计时器的回调函数只能在主线程空闲时运行,因此又带来了偏差