如果JavaScript是单线程的,那么这是什么?

时间:2012-03-01 08:29:24

标签: javascript jquery

这是code

// link 1 handler. This must finish in any case before link2 starts
$('#link1').click(function () {
    console.log("First Handler");
    setTimeout(function() {
        console.log("Thread???");
    }, 2000);   
});

// link 2 handler. It starts only when block code of link1's handler finish
$('#link2').click(function () {
    console.log("Second Handler");    
});    

$('#link1').click();
$('#link2').click();

依次单击link1和link2,意味着(对于我understand)link2处理程序的块代码在link1的处理程序完成之前无法启动(因为JS是单线程,系统事件是同步的) )。

那么,为什么console.log("Thread???");会在2秒后打印出来?我看到它像一个线程。而且,行为也一样......

7 个答案:

答案 0 :(得分:6)

单线程?是!!对于这里的简短回答而言,这个解释太过全面,并且之前已经介绍过。看到这篇精彩的文章:John Resig - How JavaScript Timers Work

编辑:因为“是!!”没有例外。 : - )

答案 1 :(得分:5)

当为link1触发处理程序时,它会运行整个函数,包括仅注册运行console.log("Thread???")语句的函数的setTimeout函数。这很快就会发生。想想这就像你会瞄准枪支一样。你还没有解雇,你刚准备开火并且正在进行2秒的倒计时。

换句话说,setTimeout函数不会阻止任何其他函数的执行,并且(强调添加)不会强制link2等待。就link1的处理程序而言,它完成了它的工作,并且JavaScript引擎继续执行link2的处理程序,该处理程序也会在你的2000ms事件触发之前完成。

答案 2 :(得分:2)

Javascript是单线程但代码执行可以是异步的。

这是执行顺序:

link1 clicked -> link2 clicked -> link1 handler executed -> link2 handler executed -> waiting for less than 2 seconds -> link1 setTimeout event handler logic executed

答案 3 :(得分:1)

我想我可以尝试总结一下。

有一个循环的阙,定时器有一个时刻可以在开始/结束时进行评估(有同样的事情),并检查它们的事件。

这似乎是一个愚蠢的答案,但它在概念上是正确的。

我保证拥有这个概念,您可以在精心设计的while循环中实现自己的版本。只是不要认为它=)

答案 4 :(得分:0)

如果要在java脚本中使用线程,可以使用HTML5的WebWorker对象。 请参阅John Resig关于WebWorkers的文章http://ejohn.org/blog/web-workers/

答案 5 :(得分:0)

JavaScript [作为脚本]是单线程的,但它运行的浏览器可以利用操作系统的多线程功能。

如果程序员需要,有多种方法可以在多线程环境中运行Javascript代码块:

  1. 使用setTimeout()方法将传递给它的一块块排队作为参数。
  2. 使用ActiveX / Applet / Flash组件:哪些是在浏览器内运行的本机代码或作为单独的进程运行。 Javascript可以获得对这些组件的控制,并可以在它们上调用方法。
  3. 此外,所有AJAX调用都是多线程的,因为它们通过ActiveX发生并支持回调。

    因此,单线程JavaScript的概念是错误的......它限制用户创建和操作线程。

答案 6 :(得分:0)

我觉得这有帮助你!!!!

HTML

<input type="button" value="click me">
<input type="text">

首先编码;

<script>
  var button = document.body.children[0]
  var text = document.body.children[1]

 button.onclick = function() {
    alert('in onclick')

    text.focus()

    alert('out onclick')
  }

  text.onfocus = function() {
    alert('onfocus') 
    text.onfocus = null  //(*)
  }
</script>

第二次编码;

<script>
  var button = document.body.children[0]
  var text = document.body.children[1]

 /* button.onclick = function() {
    alert('in onclick')

    text.focus()

    alert('out onclick')
  }*/

  text.onfocus = function() {
    alert('onfocus') 
    text.onfocus = null  //(*)
  }
  button.onclick = function() {
      alert(1)
      setTimeout(function() { text.focus() }, 0)
      alert(2)
    }
</script>