Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果JavaScript是单线程的,这是什么?_Javascript_Jquery - Fatal编程技术网

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

如果JavaScript是单线程的,这是什么?,javascript,jquery,Javascript,Jquery,这是: 按顺序单击link1和link2意味着(对于我来说)link2处理程序的块代码不能在link1处理程序完成之前启动(因为JS是单线程的,系统事件是同步的) 那么,为什么要使用console.log(“线程?”)将在2秒后打印?我看它像一根线。而且,它的行为是相同的…单线程?对这里的解释过于全面,无法给出一个简短的答案,之前已经讨论过了。请看这篇精彩的文章: 编辑:因为“Yes!!”:-)没有例外。Javascript是单线程的,但代码执行可以是异步的 执行命令如下: link1 clic

这是:

按顺序单击link1和link2意味着(对于我来说)link2处理程序的块代码不能在link1处理程序完成之前启动(因为JS是单线程的,系统事件是同步的)


那么,为什么要使用
console.log(“线程?”)将在2秒后打印?我看它像一根线。而且,它的行为是相同的…

单线程?对这里的解释过于全面,无法给出一个简短的答案,之前已经讨论过了。请看这篇精彩的文章:


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

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

执行命令如下:

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

我想我可以试着总结一下

有一个循环que,计时器在开始/结束时有一个时间进行评估(类似的事情),以进行检查并触发其事件

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


我保证,有了这个概念,您可以在精心制作的while循环中实现自己的版本。只是不要想太多()

如果你想在java脚本中使用线程,你可以使用HTML5的WebWorker对象。
请参阅John Resig关于WebWorkers的文章

当为link1启动处理程序时,它会运行整个函数,包括setTimeout函数,该函数仅注册运行
console.log(“线程?”)
语句的函数。这种情况发生得很快。想象一下,就像你会点燃一支枪一样。你没有开火,你只是准备开火,正在进行2秒倒计时


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

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

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

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

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

    我认为这有助于你

    HTML

    
    
    第一编码

    <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>
    
    
    var按钮=document.body.children[0]
    var text=document.body.children[1]
    button.onclick=函数(){
    警报('在onclick'中)
    text.focus()
    警报('out onclick')
    }
    text.onfocus=函数(){
    警报('onfocus')
    text.onfocus=null/(*)
    }
    
    二次编码

    <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>
    
    
    var按钮=document.body.children[0]
    var text=document.body.children[1]
    /*button.onclick=函数(){
    警报('在onclick'中)
    text.focus()
    警报('out onclick')
    }*/
    text.onfocus=函数(){
    警报('onfocus')
    text.onfocus=null/(*)
    }
    button.onclick=函数(){
    警报(1)
    setTimeout(函数(){text.focus()},0)
    警报(2)
    }
    
    link1的处理程序不应该首先启动吗,因为它是序列中的第一个?我问的不是setTimeout的内容,而是console.log(“First”)和事件的实际注册。抱歉,link1的处理程序首先被触发,但被setTimeout方法挂起,所以真正的逻辑最后被执行。太棒了。继续编辑并修正你的答案,我会去掉我的反对票:)嗯……我不相信这个命令!事实上,
    link2处理程序执行->等待不到2秒->
    是真的吗?我认为setTimeout不会等待link2处理程序的完成。它在执行link2处理程序的块代码时启动……顺序绝对正确,很容易测试:这并不能真正回答op提出的问题,但很高兴知道JS引擎在更现代的浏览器中变得越来越先进。异步!=多线程创建文章!当没有其他东西阻止执行时,事件和计时器在两者之间执行。基于此,只有在计划执行时没有其他东西占用线程的情况下,才能保证计时器按时执行。这是一个很好的答案,很好地描述了本例中发生的情况!“换句话说,setTimeout函数不会阻止任何其他函数的执行并强制link2等待”?不link2不等待执行link1的setTimeout!
    <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>