1

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

而且我对异步事件/同步事件/事件循环的理解还很早,所以如果我完全错了,请告诉我。但我的理解是同步事件(嵌套?)是“立即触发”的,我已经看到它发生在 jsfiddle 上,并从关于该主题的教程中进行标准剪切和粘贴。我只是对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>

将产生'in onclick'、'onfocus'、'out onclick'。焦点是一个同步事件。js 如何知道在“text.focus()”之后使用下一条语句进行备份?是不是和用帧栈做的事情一样简单?

4

1 回答 1

1

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

于 2013-07-30T00:01:19.837 回答