JavaScript文件的初始运行

JavaScript文件的初始运行,javascript,javascript-events,callstack,event-loop,Javascript,Javascript Events,Callstack,Event Loop,在Javascript中,每当调用异步操作/事件时,都会创建一条消息以及操作/事件的回调函数(该函数仅在操作/事件完成后运行) 操作/事件完成(或触发)后,消息移动到消息队列中。此消息队列不断轮询(此轮询称为“事件循环”),当在队列中找到消息时,该消息的回调将放在callstack上并运行。然后,我们返回事件循环,等待一条新消息,或者抓取队列中的下一条消息并运行其回调 我的问题是:在所有这些之前,当JavaScript文件第一次运行时,在事件循环启动之前,是否所有的东西都在同一个调用堆栈上运行?

在Javascript中,每当调用异步操作/事件时,都会创建一条消息以及操作/事件的回调函数(该函数仅在操作/事件完成后运行)

操作/事件完成(或触发)后,消息移动到消息队列中。此消息队列不断轮询(此轮询称为“事件循环”),当在队列中找到消息时,该消息的回调将放在callstack上并运行。然后,我们返回事件循环,等待一条新消息,或者抓取队列中的下一条消息并运行其回调


我的问题是:在所有这些之前,当JavaScript文件第一次运行时,在事件循环启动之前,是否所有的东西都在同一个调用堆栈上运行?

这是一个非常有趣的问题。毫无疑问,有人会提供更好的解释,因为我不完全理解发生了什么,但从我的测试中,我确定你的问题的答案是否定的

以下面的代码示例为例:

alert( 'start' );

var cats = document.getElementById( 'cats' );

cats.addEventListener('click', function() {
    alert( 'cats' );
});

cats.click();

alert( 'finish' );
警报如下所示:
start
cats
finish
cats
出现在
finish
之前的事实证明消息是在代码执行时添加到事件循环中的,而不是在代码执行之后


谢谢你帮我澄清这一点。现在我想知道,在堆栈中执行每一行之后,事件循环是否必须打勾。@Nathan也许,但不幸的是,这超出了我的知识范围。如果你碰巧做了一些研究并找到了答案,请回来发布你的发现!