位置: 编程技术 - 正文

理解javascript定时器中的单线程(javascript定律)

编辑:rootadmin

推荐整理分享理解javascript定时器中的单线程(javascript定律),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:js定义类的三种方法,javascript中的函数如何理解,javascript的定义,javascript定律,javascript定律,javascript中的函数如何理解,javascript定律,javascript的定义,内容如对您有帮助,希望把文章链接给更多的朋友!

一、JavaScript 引擎是单线程的

可以从下面的代码中看到,第一个用setTimeout中的代码是死循环,由于是单线程,下面的两个定时器就没机会执行了。

浏览器的内核是多线程的,它们在内核制控下相互配合以保持同步,一个浏览器至少实现3个常驻线程:javascript引擎线程,GUI渲染线程,浏览器事件触发线程。

JavaScript引擎是基于事件驱动单线程执行的,JS引擎一直等待着任务队列中任务的到来然后加以处理,浏览器无论再什么时候都只有一个JS线程在运行JS程序。GUI渲染线程负责渲染浏览器界面,当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行。但需要注意 GUI渲染线程与JS引擎是互斥的,当JS引擎执行时GUI线程会被挂起,GUI更新会被保存在一个队列中等到JS引擎空闲时立即被执行。浏览器事件触发线程,当一个事件被触发时该线程会把事件添加到待处理队列的队尾,等待JS引擎的处理。这些事件可来自JavaScript引擎当前执行的代码块如setTimeOut、也可来自浏览器内核的其他线程如鼠标点击、AJAX异步请求等,但由于JS的单线程关系所有这些事件都得排队等待JS引擎处理。

  由上图可看出,浏览器中的JavaScript引擎是基于事件驱动的,这里的事件可看作是浏览器派给它的各种任务,JavaScript引擎一直等待着任务队列中任务的到来,由于单线程关系,这些任务得进行排队,一个接着一个被引擎处理。

t1、t2....tn表示不同的时间点,tn下面对应的小方块代表该时间点的任务。

理解javascript定时器中的单线程(javascript定律)

t1时刻:

1、GUI渲染线程2、浏览器事件触发线程:在t1时间段内,首先是用户点击了一个鼠标键,点击被浏览器事件触发线程捕捉后形成一个鼠标点击事件,由图可知,对于JavaScript引擎线程来说,这事件是由其它线程异步传到任务队列尾的,由于引擎正在处理t1时的任务,这个鼠标点击事件正在等待处理。3、定时触发线程:这里的浏览器模型定时计数器并不是由JavaScript引擎计数的,因为JavaScript引擎是单线程的,如果处于阻塞线程状态就计不了时,它必须依赖外部来计时并触发定时,所以队列中的定时事件是异步事件。4、在这t1的时间段内,继鼠标点击事件触发后,先前已设置的setTimeout定时也到达了,此刻对JavaScript引擎来说,定时触发线程产生了一个异步定时事件并放到任务队列中,该事件被排到点击事件回调之后,等待处理。同理,还是在t1时间段内,接下来某个setInterval定时器也被添加了,由于是间隔定时,在t1段内连续被触发了两次,这两个事件被排到队尾等待处理。5、ajax异步请求:浏览器新开一个http线程请求,当请求的状态变更时,如果先前已设置回调,这异步线程就产生状态变更事件放到JavaScript引擎的处理队列中等待处理。二、任务的执行顺序不同,显示结果也不同

1)未使用setTimeout函数

在网上找到的一段代码实例,这里用来演示一下。

我在firefox中执行了上面的代码。计划是点击“do something”按钮,然后显示“doing...please wait...”,接着执行sleep,最后显示“done”。

但是结果是点击后,浏览器卡住3秒左右,最后直接显示done。

分析下看出,在做status.innerHTML设置的时候,是需要执行GUI渲染线程的,但是现在还在执行JavaScript引擎线程,而JavaScript引擎线程与GUI渲染线程是互斥的,所以就最后显示了done。

2)使用了setTimeout函数

在“doing...please wait...”后面加了个setTimeout,延时执行,给了浏览器渲染的时间,这个时候会显示出“doing...please wait...”的字样,然后执行sleep函数,最后显示“done”。

后面有网友发现在firefox中不起作用,的确有这个问题,后面我修改了一下代码,将局部变量的声明,onclick的绑定放到了window.onload事件中,等页面结构加载完成后,我再做脚本操作。

标签: javascript定律

本文链接地址:https://www.jiuchutong.com/biancheng/380421.html 转载请保留说明!

上一篇:javascript每日必学之多态(js每天的定时任务)

下一篇:JavaScript添加随滚动条滚动窗体的方法(javascript添加元素)

  • 如何查询开出的全电发票
  • 利润表季报的本期金额是本年累计吗
  • 工程机械租赁税点
  • 以前年度调整后财务报表
  • 作废的发票还需要保存吗
  • 租地建厂房合同
  • 国际货运代理0税率和免税
  • 如何简单区分坏人和坏人
  • 加计扣除是什么意思啊举例
  • 报废车辆残值收入交多少增值税
  • 以前多计提了应付职工薪酬怎么平账?
  • 企业采购材料没有发票是要交企业所得税吗
  • 包装物一次摊销的会计分录
  • 公司出差开自己的车怎么计算损耗
  • 项目结余是什么意思
  • 其他应付款变动率公式
  • 销售合同总金额含税还是不含税
  • 销售货物或者提供应税劳务、服务清单怎么开
  • 分公司开票怎么做账
  • 过期没有进行申报印花税会怎样
  • 文化建设事业费逾期申报有罚款吗
  • 喷绘广告公司税率是多少
  • 逃避缴纳税款罪移送公安标准
  • 加油票不打公司会怎么样
  • 商砼税率是多少?
  • 公司购买地下停车位如何入账
  • 电子发票能报税不
  • 网页老是自己跳出来
  • 收到服务费专票怎么做账
  • 硬盘的转速有什么用
  • 自产产品用于业务招待,成本10万,售价20万
  • 收境外汇款时怎么操作
  • LangChain Agent 执行过程解析 OpenAI
  • session for
  • symerr函数
  • vscode调试在哪
  • php目录浏览
  • 有意义的分享
  • yolo object detection
  • 社会团体会员费做分录
  • 为什么电子章打印出是黑色的
  • 制造费用的主要内容
  • 现金流量表本月数和本年累计数是相等的么
  • 返回个人所得税的分录
  • mongodb聚合函数详解
  • 2021新旧会计准则的比较分析
  • 职工福利费的开支范围的规定扣除
  • 建筑安装增值税纳税地点
  • 捐赠收入为什么要计入应纳税所得额
  • 一般纳税人无形资产税率
  • 进出车间管理规定适用
  • mac下安装mysql
  • 小规模纳税人开专票税率是1%还是3%
  • 搬迁补偿款的会计分录
  • 企业取得的财政补贴是否缴纳增值税
  • 红冲去年费用会计分录
  • 进口产品没有发票怎么入账
  • 销售货物并提供安装服务是混合销售吗
  • 年金现值和年金终值的例题
  • 装修费用一次性摊好还是分期好
  • 运费未付的会计分录怎么做
  • 记账凭证的附件数可以手改吗
  • win8开机启动
  • CentOS下Uptime命令详解
  • win7鼠标间歇性卡顿一两秒
  • windowsxp文件夹里面的文件突然消失
  • linux编译安装怎么卸载
  • windows8各个版本区别
  • 向量上面有个倒着的v
  • android Unable to execute dex问题的解决
  • opengl绘制坐标轴
  • linux中使用bash是什么意思
  • firefox怎样调整为中文
  • java.基础
  • My Magic Android Tour —— 处女作
  • activity的作用和生命周期
  • android 图片视频轮播框架
  • 社保银行代扣收费吗
  • 工程开具增值税专用发票
  • 企业所得税季度申报时间
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设