.JS的执行特点
   源于单线程的特性, JS在一段时间内只能执行一部分代码, 那么, 当有多块代码需要执行时, 就需要排队等候了.
 
二.单线程与异步事件
(1) 什么是异步事件?
    异步事件是像鼠标点击、计时器释放、XMLHttpRequest请求完成这样的动作, 由于我们不知道它何时执行, 所以, 可以认为它是不同步的(这些说明只能作为帮助理解的参考, O(∩_∩)O).
 
(2) 异步事件是否会受到单线程的影响?
    答案是肯定的: 异步事件也必须排队等候(即异步事件对应的JS回调函数, 也必须排队等候执行, 如何排队则因浏览器而异). 
 
我们经常借助setTimeout来"改善恶劣的等候情况", 这里就以一个setTimeout的例子, 来展示一下单线程独特的魅力:
 
// code
<script type="text/javascript">

function ShowCurrentTime(){
var date = new Date();
var now = "";
now = date.getFullYear()+"-";
now = now + (date.getMonth()+1)+"-";
now = now + date.getDate()+" ";
now = now + date.getHours()+":";
now = now + date.getMinutes()+":";
now = now + date.getSeconds();
return now;
}

function test(){
console.log('a_time:' + ShowCurrentTime());

//访问该连接会延迟12秒
$.post('http://www.xxxxx.com/oilcard/index','',function(){
console.log('b_time:' + ShowCurrentTime());
},'html');
console.log('c_time:' + ShowCurrentTime());
}

test();
setInterval("console.log('d_time:' + ShowCurrentTime())", 1000 );

</script>
 
// 执行结果

执行先后:a,c,d,b ;

 
// 对执行结果的分析
从结果可以很明显的看到, 延时函数是在add函数执行完之后才执行的, 为什么会这样呢? 这是因为,
timeout只延时了15ms, 而add函数执行所需的时间远大于15ms, 也就是说, 在add函数还未执行完毕
时, 计时器就已经释放了, 但是由于单线程的原因, 延时函数不会立即执行(因为当前时间段内, add函数还在执行), 而此时, 浏览器会将延时函数编入队列, 以便能在下一个可执行的时间段内得到执行.(过程如下图)
 
 
再来个例子:
去掉上面的延迟12秒响应;
结果:
 
执行先后是: acbd;
你看,就代码块来说,在同一个作用域里的代码优先执行。
后面才执行的D;
 
 
 
同样类似的例子在php中,无法重现,绝对的按语言优先级来。

JS有趣的单线程的更多相关文章

  1. 探秘JS的异步单线程

    对于通常的developer(特别是那些具备并行计算/多线程背景知识的developer)来讲,js的异步处理着实称得上诡异.而这个诡异从结果上讲,是由js的“单线程”这个特性所导致的. 我曾尝试用“ ...

  2. js为什么是单线程的?10分钟了解js引擎的执行机制

    深入理解JS引擎的执行机制 1.JS为什么是单线程的? 为什么需要异步? 单线程又是如何实现异步的呢? 2.JS中的event loop(1) 3.JS中的event loop(2) 4.说说setT ...

  3. JS(异步与单线程)

    JS(异步与单线程) 题目1.同步和异步的区别是什么,试举例(例子见知识点) 区别: 1.同步会阻塞代码执行,而异步不会 2.alert 是同步,setTimeout 是异步 题目2.关于 setTi ...

  4. JS定时器和单线程异步特性

    首先要说的是,定时器相关的方法都是属于BOM方法,而定时器呢,它是用于在设定的时间执行一段代码,或者在给定的时间间隔内重复该代码.具体函数: setTimeout(callback, delay);/ ...

  5. JS为什么是单线程的?

    JavaScript语言最大的特点就是单线程.它是浏览器的脚本语言.在同一时间只能做一件事.用于操作DOM.如果JS是多线程的,当我在给一个DOM添加内容时,又删除了这个DOM,那么JS该怎么做. 关 ...

  6. 使用PHP顶替JS有趣DOM

    較简单,我须要把一个导航页的数据整理好写入数据库.一个比較直观的方法是对html文件进行分析.通用的方法是用php的正則表達式来匹配.可是这样做开发和维护都非常困难,代码可读性非常差. 导航页的数据都 ...

  7. JS 有趣的JS

    一. var arr = []; for (var i = 0; i < 3; i++) { arr[i] = function() { console.log(i+'__') // 3 3 3 ...

  8. JS 有趣的eval优化输入验证

    //eval就是计算字符串[可以放任何js代码]里的值 . var str1='12+3'; eval(str1); . var str2='[1,2,3]'; eval(str2[]); .eval ...

  9. [jQuery]入口函数(一) jquery.min.js 一定要单线程下载,复制粘贴容易入坑

    jQuery入口函数 等着DOM结构渲染完毕即可执行内部代码,不必等到所有外部资源加载完毕 $(function () { // 此处是页面DOM加载完成的入口 }); $(document).rea ...

随机推荐

  1. git push报错:error: RPC failed; result=22, HTTP code = 413

    新项目推送到服务器时报错: error: RPC failed; result=22, HTTP code = 413| 7.66 MiB/s    fatal: The remote end hun ...

  2. Eclipse中配置resin 4.x

    开发web项目时,你还困扰在,反复启动web容器的痛苦中么?也许会有人说,用调试模式.但是如果涉及到配置文件或者service类,还是不得不重启web容器吧,而且偶尔会出现抽风情况,没生效的情况(这时 ...

  3. 第三百九十一节,Django+Xadmin打造上线标准的在线教育平台—404,403,500页面配置

    第三百九十一节,Django+Xadmin打造上线标准的在线教育平台—404,403,500页面配置 路由映射在全局也就是根目录里的urls.py里配置404路由映射 注意:不是写在urlpatter ...

  4. python3处理json文件中含有中文dumps的应用

    python3的编码问题一直比较简单 内存中字符串采用unicode 存储到文件中采用utf-8 以下为str,byte互相转换的过程: str = "abc学习" str Out ...

  5. Unity-------------------------关于GUI绘制的编程

    转载:在这篇文章中我将给读者介绍Unity中的图形用户界面(GUI)编程.Unity有一个非常强大的GUI脚本API.它允许你使用脚本快速创建简单的菜单和GUI. 简介 Unity提供了使用脚本创建G ...

  6. CI框架 -- 驱动器

    驱动器目录及文件结构 下面是驱动器目录和文件结构布局的简单例子: /application/libraries/Driver_name Driver_name.php //驱动器名称 drivers ...

  7. Python——hashlib

    该模块实现了诸多安全哈希和消息摘要算法的通用接口,包括 FIPS 安全哈希算法: SHA1, SHA224, SHA256, SHA384 和 SHA512 算法(在 FIPS 180-2 中定义), ...

  8. Lemon OA第1篇:简单介绍

    官方网站:http://www.mossle.com/ 声明:我不是Lemon OA作者,只是分享好的资源.以下内容均代表个人见解~ 从官网说起 知道Lemon OA,也是最近研究Activiti,看 ...

  9. 汉语拼音转换工具(Python 版)

    汉语拼音转换工具(Python 版) http://pypinyin.readthedocs.org/en/latest/

  10. S 参数说明

     微波系统主要研究信号和能量两大问题:信号问题主要是研究幅频和相频特性:能量问题主要是研究能量如何有效地传输.微波系统是分布参数电路,必须采用场分析法,但场分析法过于复杂,因此需要一种简化的分析方法. ...