Javascript 处理同步事件后会发生什么?

Javascript 处理同步事件后会发生什么?,javascript,javascript-events,Javascript,Javascript Events,考虑到javascript的单线程性,当触发同步事件(例如DOM操作)时,当前执行的函数块在被中断时会发生什么情况?浏览器如何知道在何处/何时继续执行中断的块?是否存在某种指向事件循环的“指针”的内部添加?我之所以这样问是因为我很好奇事件循环中的其他等待事件是否可以在同步事件处理程序的干预和正在执行的原始函数块的继续之间进行干预 <script> var button = document.body.children[0] var text = document.body.c

考虑到javascript的单线程性,当触发同步事件(例如DOM操作)时,当前执行的函数块在被中断时会发生什么情况?浏览器如何知道在何处/何时继续执行中断的块?是否存在某种指向事件循环的“指针”的内部添加?我之所以这样问是因为我很好奇事件循环中的其他等待事件是否可以在同步事件处理程序的干预和正在执行的原始函数块的继续之间进行干预

<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>
我对异步事件/同步事件/事件循环的理解还很早,所以如果我完全错了,请告诉我。但我的理解是,同步事件(嵌套?)是“立即触发”的,我在JSFIDLE上看到过这种情况,并使用了相关教程中的标准剪切和粘贴。我只是对javascript如何知道如何/从何处恢复它停止的地方感到困惑,因为它是如此异步驱动的

<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  //(*)
  }
</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/(*)
}

将生成“in-onclick”、“onfocus”、“out-onclick”。焦点是一个同步事件。js如何知道在“text.focus()”之后使用下一条语句进行恢复?它是否像使用帧堆栈所做的事情一样简单?

所有内置事件都是异步的,但如果要在代码中触发同步事件,它的工作方式将与任何在完成后返回的常规函数调用一样。没有任何事件会突然中断代码的执行-在开发工具中按“停止执行”实际上会中断代码的执行,因为编译后的代码在每个函数和循环中都会出现检查。

所有内置事件都是异步的,但是如果要在代码中触发同步事件,它的工作原理与任何常规函数调用一样,一旦完成就返回。没有任何事件会突然中断代码的执行-在开发人员工具中按“停止执行”实际上会中断代码的执行,因为编译后的代码在每个函数和循环中都充满了检查。

即使他讨论的是不同的场景,也可以帮助您看到:即使他讨论的是不同的场景,它还可以帮助你明白:我不明白你所说的“内置”事件是什么意思。像focus()这样简单的事件是嵌套的并且是同步的。它们将中断onclick处理程序,然后将控制权返回onclick处理程序。我将用这个代码片段更新我的原始帖子。@TracyGentry我指的是一个非自定义事件,要使自定义事件异步,在调用侦听器时需要使用setTimout或类似方法。@TracyGentry如果你指的是
.focus()
,那不是中断,而是所有函数调用的工作方式,控件转到focus函数,该函数将调用listners,listners将返回到focus函数,最后返回到您最初调用的位置。focus()在focus()被“激发”时,您是否说事件循环根本不涉及。focus()调用放在帧堆栈上,优先于正在执行的事件(在我的示例中为onclick)?非常感谢!我和这件事有着很大的脱节。我想很明显,您已经解释过,它的同步方面“嵌入”在正在处理的异步事件中(异步调用,然后在其处理程序方法中执行同步调用)。我不理解您所说的“内置”事件是什么意思。像focus()这样简单的事件是嵌套的并且是同步的。它们将中断onclick处理程序,然后将控制权返回onclick处理程序。我将用这个代码片段更新我的原始帖子。@TracyGentry我指的是一个非自定义事件,要使自定义事件异步,在调用侦听器时需要使用setTimout或类似方法。@TracyGentry如果你指的是
.focus()
,那不是中断,而是所有函数调用的工作方式,控件转到focus函数,该函数将调用listners,listners将返回到focus函数,最后返回到您最初调用的位置。focus()在focus()被“激发”时,您是否说事件循环根本不涉及。focus()调用放在帧堆栈上,优先于正在执行的事件(在我的示例中为onclick)?非常感谢!我和这件事有着很大的脱节。我想很明显,您已经解释过,它的同步方面“嵌入”在正在处理的异步事件中(异步调用,然后在其处理程序方法中执行同步调用)
<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>