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. iOS:视图切换的第一种方式:模态窗口

    一.UIModalController:模态窗口(一个控制器模态出另一个控制器的模态窗口) 当我们在view controller A中模态显示view controller B的时候,A就充当pre ...

  2. Hadoop,MapReduce,HDFS面试题

    今天发这个的目的是为了给自己扫开迷茫,告诉自己该进阶了,下面内容不一定官方和正确.全然个人理解,欢迎大家留言讨论 1.什么是hadoop 答:是google的核心算法MapReduce的一个开源实现. ...

  3. 编写nios-shell时想到的问题-回车vs换行

    在编写nios上类shell用户交互代码时.由于要检測终端输入字符.所以想到了这个问题,故分析之. 回车符的ascii码,ASCII码13 '\r' 换行符的ascii码.ASCII码10 '\n' ...

  4. C#基础视频教程4.2 如何编写简单的计算器

    用过VB6或者早期代码的人都应该能感觉到,C#目前也没看出来有什么特别之处,所谓的面向对象也没有什么体现.所以我们需要在原有基础上重写一份代码,然后比较两种做法的优缺点.我们在项目上右击添加一个Fun ...

  5. 符号三角形_hdu_2510(深搜).java

    http://acm.hdu.edu.cn/showproblem.php?pid=2510 Time Limit: 2000/1000 MS (Java/Others)    Memory Limi ...

  6. PHP Filter函数

    PHP Filter 函数 PHP Filter 简介 PHP 过滤器用于对来自非安全来源的数据(比如用户输入)进行验证和过滤. 安装 Filter 函数是 PHP 核心的组成部分.无需安装即可使用这 ...

  7. UNIX网络编程读书笔记:TCP输出、UDP输出和SCTP输出

    TCP输出 下图展示了应用进程写数据到TCP套接口的过程. 每一个TCP套接口有一个发送缓冲区,我们可以用SO_SNDBUF套接口选项来改变这个缓冲区的大小. 当应用进程调用write时,内核从应用进 ...

  8. Adobe Audition3.0 找不到所支持的音频设备 请检查您的音频设置

      Adobe Audition 找不到所支持的音频设备 请检查您的音频设置   解决方案:   运行regedit,打开注册表编辑器,定位到 HKEY_CLASSES_ROOT\CLSID\{AB7 ...

  9. Spring 基于xml配置方式的AOP

    我们具体用代码来说明: 1.ArithmeticCalculator.java package com.proc; public interface ArithmeticCalculator { in ...

  10. dubbo初探(转载)

    1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需 ...