-1

有时我发现,JavaScript 有多个线程,这让我很恼火。我上网查了一下,发现总是有人说只有一个线程,但我遇到的不止一个。您可以将代码复制到 html 文件中,然后运行。你会明白我的意思。为什么 javascript 有多个带有警报、确认、提示的线程?谢谢阅读。

注意:要对其进行测试,您应该获取 jQuery 并替换它。

<html>
<head>
<script type="text/javascript" src="js/jquery-1.7.2.js"></script>
<script type="text/javascript">
function pauseWithAlert(){
  fireAjax();
  alert("pause at one thread, I guess before this OK is clicked, no javascript should be executed since single thread, and the runner is with this thread in this function fpause");
}

function pauseWithConfirm(){
  fireAjax();
  if(confirm("the message has been triggered, while the 1st thread is paused with this confirmation request, but the message from another thread has been presented to you")){
    //something;
  }
}

function pauseWithDeadLoop(){
  alert("after you click OK, I will trigger the message, and then let the 1st thread get into dead loop, you will not be able to see the message");
  fireAjax();
  while(true);
}


function fireAjax(){
  var location = document.location.toString();
  $.ajax({type:'get',dataType:'html',url:location,success: ajaxSuccess, error: ajaxError});
}

var message = "have you clicked the OK in the 1st thread, this is a message from 2nd thread, isn't it?";
function ajaxSuccess(){
  document.getElementById('ajaxmessage').textContent = message;  
}

function ajaxError(){
  document.getElementById('ajaxmessage').textContent = message;  
}

function clearMessage(){
  document.getElementById('ajaxmessage').textContent = "";  
}
</script>
</head>
<body>
I know that it was said javascript is just one thread.
However, I found that sometimes, it is not just one thread.
<br/>Click <span onclick="pauseWithAlert();">here to pause with an alert</span> or
  <span onclick="pauseWithConfirm();">here to pause with a confirm</span>, 
and the runner stops there in the 1st thread, but you will see a message from 
another thread below, so not single thread????? No!!!
<br/>Click <span onclick="pauseWithDeadLoop();">here</span> to stop the 1st thread 
with a dead loop, you will not see a message from another thread below.
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>

<span id=ajaxmessage></span>
<br/>
<span onclick="clearMessage();">Clear the above message</span>

</body>
</html>
4

2 回答 2

7

Javascript 只有一个工作线程,但它有回调,所以在你看来似乎有多个线程,但实际上没有。

于 2012-06-18T03:29:23.340 回答
0

简短的回答是这取决于浏览器。但它实际上并没有演示多线程。

例如,使用最新版本的 Chrome,我看不到您描述的行为。

使用最新版本的 Firefox,我确实看到了一些奇怪的东西。即,在显示警报(或之前) ,DOM 似乎会更新(即,已触发传递给 AJAX 请求的回调)。我感觉到您已经得出结论,因此必须有多个线程,因为alert应该是阻塞调用。

我不知道这一点,但我有一个关于为什么会这样的理论。如果您考虑 的语义alert,它要求调用之后 alert的代码在用户单击“确定”(或其他任何内容)之前不会执行。但这实际上并不意味着调用必须在传统意义上阻塞(即旋转和等待)。JavaScript 引擎实际上可能实现alert为基于回调的协议,以便alert调用之后的代码构成一个回调,该回调在用户单击“确定”后触发。

根据这个实现,$.ajax随后的调用alert就像$.ajax连续进行两次调用一样,在这种情况下,第一个回调可能在第二个 AJAX 请求收到响应之前触发也就不足为奇了。

另一种可能性(尚未测试)是 Firefox 只是有一个优化,其中对当前窗口位置的 AJAX 请求同步返回当前页面的 HTML。牵强,也许,但肯定有可能。

我在这里要说明的要点是,您实际上并没有发现 JavaScript 中多线程的证明。还有其他解释。但是,我确实与您一样困惑,我同意至少在一种流行的浏览器中存在一些令人费解的行为。

于 2012-06-18T04:13:14.143 回答