大家都知道javaScript是单线程引擎,当一个事件被触发,将排在执行队列的最后,等待执行。但是我在firefox13.0中测试就不是表现成这一特性。觉得想不通。代码如下:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="./js/jquery-1.4.2.min.js" ></script>
<script type="text/javascript">
$(document).ready(function(){
var i=0;
$('#a').bind("click",function(){ var a=setTimeout(clickEvent,1000)});
function clickEvent(){alert('a'+i++);alert('a end');}
$('#b').bind("click",function(){alert('b'+i++);alert('b end');});

});
</script>
</head>
<body>
<a id="a">aaa</a>
<a id="b">bbb</a>
</body>
</html>如果快速的点击aaa后立即点击bbb,可以看到 有一种奇怪的输出情况,输出顺序是b0,a1,a end 和b end,怎么会b点击事件的代码块才执行一半就跳到a点击事件的代码块执行呢?跟js单线程引擎说法不符。

解决方案 »

  1.   

    你理解错js的单线程了吧!   比如你点击a时有个继续函数 setTimeout 1秒后执行clickEvent函数,在这1秒还没有到你又点击了b  所以就先执行b了,而alter会阻塞线程 且js是单线程 所以 settimeout就会被阻塞即:不去计时。也就是说如果你把b的alter执行了你不去点击那个确定,那么a的回调函数永远不会执行。 这个就是js的单线程!  如果是多线程的话,a的时间到了就会弹出框的。接下来说说b被打断的原因:点击了a ,a就开始计时了,可能计时到0.999秒的时候你点击了b,这时b弹出框,a暂停,点击确定后弹出b的第二个框就排在a的后面了,所以就先执行了a的弹框,之后才执行b有不懂的再问
      

  2.   

    你说的理解了,但是对于b被打断,还有个疑问想请教。
       那不是以代码块为单位的吗?比如我b已经执行了,就说明b的代码块放在了将要执行队列的前面,而点击b的第一个alert的确定后,a时间到了,那a的回调函数代码块放在了队列的最后,在这也就是b代码块的后面。所以执行应该是b0,b end,a1,a end ?还是不能以函数块为单位。而是以有;的行有单位?为什么线程执行资源会被a抢走?
      

  3.   

    弹出b的时候,a还处于wait状态,js为单线程,会释放线程锁。点击B,b同时也处于wait状态。因为你点击了b确定,所以b已经被了notify,连续执行b,待b执行完后,你有点击a,a弹出对话框
      

  4.   


    更正下这个。。我自己写了个代码测试,就是讲楼主的代码复制过去测试,弹出的确实是
     b0       b end      a1        a end且  ie8  chrome  ff   下测试均是如此。请问楼主是如何测试的?使用的是什么浏览器呢?
      

  5.   

    我用的是firefox 13.0.1版本的,在同事那也测过,一直是b0,b end ,a1,a end.他是用其他更低版本的。而我这浏览器就两种情况都可能,所以就觉得奇怪。
      

  6.   

    我现在firefox版本升级到了14.0.1,也会出现这种结果, b0,a1,a end,b end.
      

  7.   

    我用ie8测试跟你的结果一样,不出现这种现在,一直都是b0,b end,a1, a end. 那应该跟浏览器有关了。
      

  8.   

    你先确认alert的特性比较好因为 alert 并不是js本身的东西js是单线程  alert没有明确是什么吧
      

  9.   

    firefox13.0.1版本更新了JavaScript引擎IonMonkey。如果跟这个有关,为什么要这么更新呢,不是跟js单线程不一致?