javascript的运行过程以及setTimeout的运行机制
关于javascript的运行机制大家都应该有所了解了吧,其实javascript是一个单线程的机制,但是因为队列的关系它的表现会让我们感觉是一个多线程的错觉。javascript在运行的时候是这样的,一个线程出发,然后将代码从上至下的运行下来期间只有一条线程是活跃的,(这里我们只讲javascript的线程其他线程不涉及,其他的也可能会跟javascript的线程发生并行或者挂起,这个我们不关心)那这样的话在javascript运行的时候遇到setTimeout的时候会怎么样呢?这里我们先简单说一下setTimeout的原型setTimeout的原型如下:
setTimeout(function(){//待执行的函数或者命令},500),这里的function(){//待执行的函数或者命令}是要执行的函数,也可以直接用abc()来写。后面的500是等待时间,也就是说等待500毫秒后执行(这里的单位是毫秒)。设置这个的意思就是等待500毫秒后执行function(){//待执行的函数或者命令}这个函数。好了够清楚了,再不懂的去百度吧~
下面就是我们重点要说的:
当javascript运行时遇到setTimeout后其实会另开一条线程(刚刚不是说javascript是单线程的嘛?)。是的,没错javascript是单线程的,但是setTimeout会另开一个线程,这个线程依赖于某个计时装置,这时,javascript其实是不管setTimeout而继续往下进行的,而setTimeout也是独立的线程计时的。而javascript在运行完全部的代码后会回过头来重新检测自己的队列中有没待执行的命令或者函数,如果有就执行,没有就等待。直到有待执行的命令被加载进这个队列中然后执行。在这期间,setTimeout依赖的那个计时线程如果时间到了,那么它会把setTimeout中要执行的函数或者命令传送到javascript的等待队列中,等待javascript执行完命令后回头来检测等待队列中未执行的函数或命令。通过下面一个例子你就会明白为什么的
<script type="text/javascript">
var t=true;
window.setTimeout(function(){
t=false;
},1000);
while(t){ }
alert('end');
</script>
这个代码会让浏览器陷入崩溃,为什么?看下面的解释:
首先变了t是true,也就是说t为真,然后javascript往下执行,遇到了setTimeout,这时setTimeout启用了另一个计时线程。此时javascript不管它跳过(因为它由另一个线程来控制)。然后遇到了while(t)这个循环,因为前面把t设置成了真,所以这个循环一直成立,所以也就一直循环下去,成了死循环。所以浏览器的javascript线程到这里就停止了它会一直陷入死循环无法结束掉,所以下面的alert就不会执行了。而等到setTimeout的计时器到时间后就会将改变t为假的待执行函数放到javascript的等待队列中,而javascript的线程一直结束不了,所以也就无法回来检查等待队列了,所以t永远也无法变成假,而javascript也永远无法停止,所以浏览器崩溃掉……
以上为个人理解,不正确的地方请高手拍砖~谢谢~
javascript的运行过程以及setTimeout的运行机制的更多相关文章
- Job的运行过程
Job的运行过程 Job的具体运行过程 a) 运行mapred程序 b) 本次运行将生成一个Job,于是JobClient向JobTracker(ResourceManager)申请一个JobId以标 ...
- 江太公:javascript count(a)(b)(c)(d)运行过程思考
昨天,我弟抛给我一个js的题,使用类似标题那样的调用方法计算a*b*c*d以致无穷的实现方法.思考了半天,终于理清了它的运行过程,记录于下: 函数体: <!DOCTYPE html> &l ...
- python的运行过程剖析·编程语言分类
总结: 编程语言的分类 编译型: 说明:与汇编语言类似,都有一个编译程序将源代码编译成硬件可执行的二进制代码 特点:执行速度快.同等情况下对系统要求低,适合于开发大型应用程序.数据库系统.操作系统等 ...
- JAVA - JAVA编译运行过程
Java编译原理 *.java→*.class→机器码 java编译器 (编译) → 虚拟机(解释执行) → 解释器(翻译) → 机器码 1.Java编译过程与c/c++编译过程不同 Java编译程 ...
- 孙鑫MFC学习笔记3:MFC程序运行过程
1.MFC中WinMain函数的位置在APPMODUL.cpp APPMODUL.cpp中是_tWinMain,其实_tWinMain是一个宏#define _tWinMain WinMain 2.全 ...
- HOWTO - Basic MSI安装包在安装运行过程中如何获取完整源路径
有朋友问到如何在一个Windows Installer安装包中获取安装包源路径,就是在安装包运行过程中动态获取*.msi所在完整路径. 这个问题分两类,如果我们的安装包只是一个*.msi安装文件,那么 ...
- DirectShow程序运行过程简析
这段时间一直在学习陆其明老师的<DirectShow开发指南>一书,书中对DirectShow的很多细节讲解清晰,但是却容易让人缺少对全局的把握.在学习过程中,整理了关于DirectSho ...
- Java Executor并发框架(二)剖析ThreadPoolExecutor运行过程
上一篇从整体上介绍了Executor接口,从上一篇我们知道了Executor框架的最顶层实现是ThreadPoolExecutor类,Executors工厂类中提供的newScheduledThrea ...
- 基础知识《零》---Java程序运行机制及运行过程
Java运行机制 Java虚拟机(Java Virtual Machine):Java虚拟机可以理解成一个以字节码为机器指令的CPU:对于不同的运行平台,有不同的虚拟机:Java虚拟机机制屏蔽了底层运 ...
随机推荐
- 【理论篇】Percona XtraBackup 恢复单表
小明在某次操作中,误操作导致误删除了某个表,需要立即进行数据恢复. 如果是数据量较小的实例,并且有备份,即便是全备,做一次全量恢复,然后单表导出导入,虽然麻烦一点,却也花不了多少时间:如果是数据量大的 ...
- Jsoup抓取、解析网页和poi存取excel综合案例——采集网站的联系人信息
需求:采集网站中每一页的联系人信息 一.创建maven工程,添加jsoup和poi的依赖包 <!-- https://mvnrepository.com/artifact/org.apache. ...
- Array和ArrayCollection作为数据源的一个应用区别
在不用[Enabled]元标签的前提下,将一个Array赋值给DataGrid.DataList等控件的DataProvider后,当Array值发生改变时,控件显示内容不会及时更新(可调用控件的in ...
- EZChart - 在线图表生成器
朋友写材料时,需要用到一些分析图表,嫌Excel的太丑,就为他写了一个在线图表生成器. 纯静态实现,基于:H5 + Bootstrap + FusionCharts 本地存储使用H5的localSto ...
- 【整理】hash算法原理及常见函数
简介 Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值. 散列表 ...
- 【算法系列学习】巧妙建图,暴搜去重 Counting Cliques
E - Counting Cliques http://blog.csdn.net/eventqueue/article/details/52973747 http://blog.csdn.net/y ...
- 略过 Mysql 5.7的密码策略
之前从mysql 5.6的时候,mysql 还没有密码策略这个东东,所以我们每个用户的密码都可以随心所欲地设置,什么123 ,abc 这些,甚至你搞个空格,那也是OK的. 而mysql.user 表里 ...
- Vue2.0的变化 ,组件模板,生命周期,循环,自定义键盘指令,过滤器
组件模板: 之前: <template> <h3>我是组件</h3><strong>我是加粗标签</strong> </templat ...
- poj 1088 动态规划
#include <iostream> #include <string.h> using namespace std; ][];//存储当前位置能得到的最优解 ][];//存 ...
- Hadoop的安装(日志四)
上一篇:SSH免密码(日志三) 1,进入conf目录,查看所有的文件 2,第一个修改的是hadoop-env.sh的文件,配置javahome的地址 3,第二个就是配置core-site的文件,包括临 ...