我在Javascript中使用setTimeout。我对它是如何工作感到困惑。我有以下代码:
<input type="button" value='click'>
<script>
var input = document.getElementsByTagName('input')[0]
input.onclick = function() {
setTimeout(function() {
input.value +=' input'
}, 0)
}
document.body.onclick = function() {
input.value += ' body'
}
</script>
当我们单击该函数时,它会将文本正文输入附加到按钮元素。我理解这种情况正在发生,因为首先触发了父(body)事件,并且在下一个计时器滴答时,子事件(输入)事件被执行,因为它稍后在事件队列中被推送。
我现在尝试了以下代码:
var input = document.getElementsByTagName('input')[0]
document.body.onclick = function() {
setTimeout(function() {
input.value +=' body'
}, 0)
}
input.onclick = function() {
setTimeout(function() {
input.value +=' input'
}, 0)
}
这会将文本输入主体追加到button元素。当两个超时都设置为0时,如何确定执行顺序?在这种情况下,它们以什么顺序推送到事件队列?谢谢。
答案 0 :(得分:0)
首先在最里面的元素上触发点击,然后冒泡。
因此,在您的第一个示例中,首先触发点击输入,但由于setTimeout
它不会立即执行,而是将其添加到队列中,从而触发并执行正文上的事件。
现在第二种情况是解释性的,首先触发输入,并且由于setTimeout
它将执行添加到队列,但是当触发文档上的事件时它会执行相同的操作,现在执行队列因此首先执行输入然后记录事件,
这是因为JavaScript是单线程的,因此一旦setTimeout
被触发,它就会将函数推送到队列并等待超时并转而执行它。
参考进一步阅读W3.org Link