首页

源码搜藏网

首页 > 开发教程 > 网页设计 >

JavaScript可否多线程?(2)

创建时间:2013-04-26 15:51  

JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如    [javascript]
    setTimeout( function(){ alert(‘你好!'); } , 0);
    setInterval( callbackFunction , 100);
    setTimeout( function(){ alert(’你好!'); } , 0);
    setInterval( callbackFunction , 100);
    认为setTimeout中的问候方法会立即被执行,因为这并不是凭空而说,而是JavaScript API文档明确定义第二个参数意义为隔多少毫秒后,回调方法就会被执行. 这里设成0毫秒,理所当然就立即被执行了.
    同理对setInterval的callbackFunction方法每间隔100毫秒就立即被执行深信不疑!
    但随着JavaScript应用开发经验不断的增加和丰富,有一天你发现了一段怪异的代码而百思不得其解:
    [javascript]
    div.onclick = function(){
    setTimeout( function(){document.getElementById('inputField').focus();}, 0);
    };
    div.onclick = function(){
    setTimeout( function(){document.getElementById('inputField').focus();}, 0);
    };
    既然是0毫秒后执行,那么还用setTimeout干什么, 此刻, 坚定的信念已开始动摇.
    直到最后某一天 , 你不小心写了一段糟糕的代码:
    [javascript]
    setTimeout( function(){ while(true){} } , 100);
    setTimeout( function(){ alert(‘你好!'); } , 200);
    setInterval( callbackFunction , 200);
    setTimeout( function(){ while(true){} } , 100);
    setTimeout( function(){ alert(’你好!'); } , 200);
    setInterval( callbackFunction , 200);
    第一行代码进入了死循环,但不久你就会发现,第二,第三行并不是预料中的事情,alert问候未见出现,callbacKFunction也杳无音讯!
    这时你彻底迷惘了,这种情景是难以接受的,因为改变长久以来既定的认知去接受新思想的过程是痛苦的,但情事实摆在眼前,对JavaScript真理的探求并不会因为痛苦而停止,下面让我们来展开JavaScript线程和定时器探索之旅!
    出现上面所有误区的最主要一个原因是:潜意识中认为,JavaScript引擎有多个线程在执行,JavaScript的定时器回调函数是异步执行的.
    而事实上的,JavaScript使用了障眼法,在多数时候骗过了我们的眼睛,这里背光得澄清一个事实:
    JavaScript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序.
    JavaScript引擎用单线程运行也是有意义的,单线程不必理会线程同步这些复杂的问题,问题得到简化.
    那么单线程的JavaScript引擎是怎么配合浏览器内核处理这些定时器和响应浏览器事件的呢
    下面结合浏览器内核处理方式简单说明.
    浏览器内核实现允许多个线程异步执行,这些线程在内核制控下相互配合以保持同步.假如某一浏览器内核的实现至少有三个常驻线程:javascript引擎 线程,界面渲染线程,浏览器事件触发线程,除些以外,也有一些执行完就终止的线程,如Http请求线程,这些异步线程都会产生不同的异步事件,下面通过一 个图来阐明单线程的JavaScript引擎与另外那些线程是怎样互动通信的.虽然每个浏览器内核实现细节不同,但这其中的调用原理都是大同小异.
    JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如
JavaScript可否多线程?(2)

上一篇:结合使用Ajax和WebSphere Portal
下一篇:CSS文字大小px和pt的区别
  • JavaScript对象方法的使用
    1/创建对象实例 一旦对象定义完成后,就可以为该对象创建一个实例了: NewObject=New object(); 其中Newobjet是新的对象,Object已经定义好的对象.例: U1=New university(广州达内,广州达内,January 05,199712:00:00,) U2=New university(广州达内,广州,January
  • javascript和html判断浏览器类型
    javascript判断 navigator.userAgent.indexOf(iPhone) HTML判断IE类型 1. !--[if !IE]!-- 除IE外都可识别 !--![endif]-- 2. !--[if IE] 所有的IE可识别 ![endif]-- 3. !--[if IE 5.0] 只有IE5.0可以识别 ![endif]-- 4. !--[if IE 5] 仅IE5.0与IE5.5可以识别
  • JavaScript开发规范要求
    作为一名开发人员(WEB前端JavaScript开发),不规范的开发不仅使日后代码维护变的困难,同时也不利于团队的合作,通常还会带来代码安全以及执行效率上的问题。本人在开发工作中 就曾与不按规范来开发的同事合作过,与他合作就不能用愉快来形容了。现在本人
  • Javascript中最常用的61个经典技巧
    1. oncontextmenu=window.event.returnValue=false 将彻底屏蔽鼠标右键 table border oncontextmenu=return(false)tdno/table 可用于Table 2. body onselectstart=return false 取消选