关于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的运行机制的更多相关文章

  1. Job的运行过程

    Job的运行过程 Job的具体运行过程 a) 运行mapred程序 b) 本次运行将生成一个Job,于是JobClient向JobTracker(ResourceManager)申请一个JobId以标 ...

  2. 江太公:javascript count(a)(b)(c)(d)运行过程思考

    昨天,我弟抛给我一个js的题,使用类似标题那样的调用方法计算a*b*c*d以致无穷的实现方法.思考了半天,终于理清了它的运行过程,记录于下: 函数体: <!DOCTYPE html> &l ...

  3. python的运行过程剖析·编程语言分类

    总结: 编程语言的分类 编译型: 说明:与汇编语言类似,都有一个编译程序将源代码编译成硬件可执行的二进制代码 特点:执行速度快.同等情况下对系统要求低,适合于开发大型应用程序.数据库系统.操作系统等 ...

  4. JAVA - JAVA编译运行过程

    Java编译原理 *.java→*.class→机器码 java编译器 (编译) → 虚拟机(解释执行) →  解释器(翻译) → 机器码 1.Java编译过程与c/c++编译过程不同 Java编译程 ...

  5. 孙鑫MFC学习笔记3:MFC程序运行过程

    1.MFC中WinMain函数的位置在APPMODUL.cpp APPMODUL.cpp中是_tWinMain,其实_tWinMain是一个宏#define _tWinMain WinMain 2.全 ...

  6. HOWTO - Basic MSI安装包在安装运行过程中如何获取完整源路径

    有朋友问到如何在一个Windows Installer安装包中获取安装包源路径,就是在安装包运行过程中动态获取*.msi所在完整路径. 这个问题分两类,如果我们的安装包只是一个*.msi安装文件,那么 ...

  7. DirectShow程序运行过程简析

    这段时间一直在学习陆其明老师的<DirectShow开发指南>一书,书中对DirectShow的很多细节讲解清晰,但是却容易让人缺少对全局的把握.在学习过程中,整理了关于DirectSho ...

  8. Java Executor并发框架(二)剖析ThreadPoolExecutor运行过程

    上一篇从整体上介绍了Executor接口,从上一篇我们知道了Executor框架的最顶层实现是ThreadPoolExecutor类,Executors工厂类中提供的newScheduledThrea ...

  9. 基础知识《零》---Java程序运行机制及运行过程

    Java运行机制 Java虚拟机(Java Virtual Machine):Java虚拟机可以理解成一个以字节码为机器指令的CPU:对于不同的运行平台,有不同的虚拟机:Java虚拟机机制屏蔽了底层运 ...

随机推荐

  1. Google Chrome 默认非安全端口列表

    1, // tcpmux7, // echo 9, // discard 11, // systat 13, // daytime 15, // netstat 17, // qotd 19, // ...

  2. dev 中的GridControl中的行实现选择的功能实现

    1.项目有实现不GridControl中的数据导出Excel的功能,导出的时候是把所有的数据全部导出,现在要实现可供选择的灵活的导出功能.除了全选可全不选,还可以对每一行实现选择的功能.实现起来比较简 ...

  3. typedef和define的详细区别

    typedef是一种在计算机编程语言中用来声明自定义数据类型,配合各种原有数据类型来达到简化编程的目的的类型定义关键字. #define是预处理指令.下面让我们一起来看. typedef是C语言语句, ...

  4. windows下安装Redis并部署成服务

    windows下安装Redis并部署成服务 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 一:下载 下载地址: windows版本: http ...

  5. 【2017-05-05】timer控件、三级联动、帐号激活权限设置

    一.Timer控件 Timer实际就是一个线程控件. 属性:Enabled    是否被启用 Interval     多长时间执行一次控件中的代码 事件: Tick     事件中放要执行的代码. ...

  6. maven(02)--简单的命令操作

    使用maven有什么好处呢? 这个问题留到该文的末尾进行总结>v< maven测试 在上一篇文章中介绍了如何简单的编译一个java文件,执行mvn compile命令后,你会发现在你新建的 ...

  7. .NET面试题系列[17] - 多线程概念(2)

    线程概念 线程和进程的区别 进程是应用程序的一个实例要使用的资源的一个集合.进程通过虚拟内存地址空间进行隔离,确保各个进程之间不会相互影响.同一个进程中的各个线程之间共享进程拥有的所有资源. 线程是系 ...

  8. Vuejs实例-01使用vue-cli脚手架搭建Vue.js项目

    [TOC] 1. 前言 vue-cli 一个简单的构建Vue.js项目的命令行界面 整体过程: $ npm install -g vue-cli $ vue init webpack vue-admi ...

  9. Oracle 只导出某个用户下的表及数据

    今天某大牛问我要之前我参与的一个系统的代码及库,我捣鼓下,发给了他. 他很诧异的问:这个库有这么大么 我说 因为当时是专门新建了一个实例,用户也是系统用户,所以导出的时候是导出的整个数据库 他 ZZ ...

  10. 谈一谈Java8的函数式编程(二) --Java8中的流

    流与集合    众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...