1.什么是javascript的单线程
javascript是单线程的语言,所以在一个进程上,只能运行一个县城,不能多个线程同时运行。
也就是说javascript不允许多个线程共享内存空间。
如果多个线程想同时运行,则必须采用排队的方式。即只有当前一个线程执行完毕,后一个线程才开始执行。
javascript的线程包括函数调用,I/O设备(ajax请求),定时器,用户操作事件(click,keyup等)

2.堆,栈,队列
堆(HEAP):存放对象。
javascript所有皆为对象,如函数是“可调用对象”,在函数被调用之前,javascript引擎会对函数进行编译,完成编译后,函数会被放入堆中,分配内存空间,等待执行或调用。

栈:执行栈。
如调用函数,响应用户操作事件。
当调用函数时,javascript引擎会创建一个执行栈,包含了被调用函数的参数和局部变量。
当被调用函数中又调用了其他函数时,如下所示:

function A(){
B();
}

此时,会把B函数推入执行栈,同时包含B函数的参数和局部变量。当B函数执行完毕后,B函数出栈,继承执行A函数,A函数执行完毕,出栈,整个执行栈就空了。然后主线程会读取任务队列中的其他任务。

队列:待执行任务队列
单线程意味着,所有任务都要排队,前一个任务执行完毕,才会执行后一个任务。
任务可以分为两种,同步任务和异步任务。
同步任务是指主线程上排队执行的任务,只有前一个任务执行完毕,后一个任务才会执行。
异步任务是指不进入主线程,而进入任务队列的任务(如回调函数,定时器,事件响应等),只有当主线程上的所有同步任务执行完毕后,主线程才会读取任务队列,开始执行异步任务。

3.定时器
定时器是异步任务,主线程会在所有同步任务执行完毕后,计算定时器的执行时间,再将事件推入执行栈。由此可知,定时器并不是完全准时执行的。
还需要注意的是,定时器在异步任务队列中是按时间长短排列的,时间越短,越早执行。
如以下代码所示:

function foo() {
setTimeout(function() {
console.log(1);
}, 2000)
console.log(2);
} function bar() {
setTimeout(function() {
console.log(3);
}, 1000);
console.log(4);
} function baz() {
setTimeout(function() {
console.log(5);
}, 0)
console.log(6);
}
foo();
bar();
baz();
//结果: 2, 4, 6, 5, 3, 1;

javascript的单线程的更多相关文章

  1. Javascript是单线程的深入分析

    本来想总结一下的,网上却发现有人已经解释的很清楚了,特转过来. 这也解释了为什么在用自动化测试工具来运行dumrendtree时设定的超时和测试case设定的超时的关联性. 面试的时候发现99%的童鞋 ...

  2. Javascript引擎单线程机制及setTimeout执行原理说明

    setTimeout用法在实际项目中还是会时常遇到.比如浏览器会聪明的等到一个函数堆栈结束后才改变DOM,如果再这个函数堆栈中把页面背景先从白色设为红色,再设回白色,那么浏览器会认为DOM没有发生任何 ...

  3. Javascript:再论Javascript的单线程机制 之 DOM渲染时机

    Javascript:再论Javascript的单线程机制 之 DOM渲染时机 背景 Javascript是单线程事件驱动的,所有能看到的Javascript代码都是在一个线程执行,定时器回调和AJA ...

  4. [转] 为什么javascript是单线程的却能让AJAX异步调用?

    为什么JavaScript是单线程的却能让AJAX异步发送和回调请求,还有setTimeout也看起来像是多线程的? function foo() { console.log( 'first' ); ...

  5. JavaScript的单线程性质以及定时器的工作原理

    前些日子还在网上争论过js动画用setTimeout还是setInterval,个人偏向于setTimeout,当动画中牵扯到ajax时用setInterval会有时间偏差,出现一些问题即使用clea ...

  6. 关于javascript的单线程和异步的一些问题

    关于js单线程和异步方面突然就糊涂了,看别人的文章越看越糊涂,感觉这方面是个坑,跳进去就不好跳出来.再去看,看着看着感觉自己明白了一些东西,也不知道对不对,反正是暂时把自己说服了,这样理解能理解的通, ...

  7. 我想这次我真的理解了 JavaScript 的单线程机制

    今天面试的时候被问到一个问题,是关于 JS 异步的.当时我脑海中闪过了一个单线程的概念,但却没有把真正的原理阐述清楚.所以回来特意重新回顾了前面单线程和异步相关的一些知识点. 虽然之前学习的时候也接触 ...

  8. JavaScript是单线程还是多线程(转)

    多线程要考虑线程之间的资源抢占,死锁,冲突之类一系列问题.JavaScript作为一门客户端脚本,貌似没有多线程的一些列问题.那么JavaScript是单线程还是多线程?通过查资料总结了JavaScr ...

  9. Javascript的单线程和异步编程

    运行时概念 下面的内容解释了一个理论上的模型.现代 JavaScript 引擎着重实现和优化了描述的几个语义. 可视化描述 栈 函数调用形成了一个栈帧. function foo(b) { var a ...

随机推荐

  1. ContentProvider的那些小事(纯结论)

    一.ContentProvider背景 Android系统是基于Linux系统内核来进行开发的,在Linux中,文件具有一系列的属性,其中最重要的莫过于文件权限了.关于文件权限,其实就是文件的读写,执 ...

  2. <%@ include> <jsp:include>

    1. <%@ include file=”relativeURI” %> 这个效果是将引入的文件内容直接加入当前JSP然后再编译,会造成的问题就是如果引入的页面中也写了head,conte ...

  3. .NET中的六个重要概念

    内容导读 概述 当你声明一个变量背后发生了什么? 堆和栈 值类型和引用类型 哪些是值类型,哪些是引用类型? 装箱和拆箱 装箱和拆箱的性能问题 一.概述 本文会阐述六个重要的概念:堆.栈.值类型.引用类 ...

  4. 【Linux】shell判空

    在shell中如何判断一个变量是否为空          博客分类: Ubuntu / Mac / Github / Aptana / Nginx / Shell / Linux   在shell中如 ...

  5. static对象

    1.static对象包括: global对象 namespace作用域下的对象 在class,function,file作用域内的static对象 2.在方法内的static对象成为 local st ...

  6. 【树莓派】Linux 系统级别代理配置

    在Windows下,通过代理服务器怎么去设置连接代理服务器,浏览器---->工具------>internet选项----->连接--->局域网设置------->勾选“ ...

  7. 判断IE浏览器版本的精简脚本

    IE浏览器不管是什么版本,总是跟Web标准有些不太兼容.对于代码工作者来说,自然是苦不堪言,为了考虑IE的兼容问题,不管是写 CSS 还是 JS,往往都要对 IE 特别对待,这就少不了做些判断.本文不 ...

  8. TypeScript 面向对象基础知识

    孙广东  2016.4.5 JavaScript如今到处都是.web.server(通过NodeJS).移动应用(通过各种框架).全部这些,TypeScript都能够使用,而且能够为JavaScrip ...

  9. CSS border 生成三角

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  10. Oracle 计算表占用空间大小

    我们可以通过系统视图DBA_SEGMENTS.USER_SEGMETNS.DBA_TABLES来查看一个表所占空间的大小,如下所示: SELECT SEGMENT_NAME TABLE_NAME ,S ...