JavaScript 文件的初始运行
Initial run through of a JavaScript file
在 Javascript 中,每当调用异步 operation/event 时,都会创建一条消息以及 operation/event 的回调函数(该函数仅在 operation/event 完成后运行).
当 operation/event 完成(或触发)时,消息移至消息队列。不断轮询此消息队列(此轮询称为 "the event loop"),当在队列中找到消息时,消息的回调将放在调用堆栈上并运行。然后我们 return 进入事件循环并等待新消息或获取队列中的下一条消息并运行其回调。
我的问题是:在所有这一切之前,当一个 JavaScript 文件第一次运行时,在事件循环启动之前所有的东西都在同一个调用堆栈上运行吗?
这是一个非常有趣的问题。毫无疑问,有人会提供更好的解释,因为我不完全理解发生了什么,但根据我的测试,我确定你的问题的答案是否定的。
以下面的代码为例:
alert( 'start' );
var cats = document.getElementById( 'cats' );
cats.addEventListener('click', function() {
alert( 'cats' );
});
cats.click();
alert( 'finish' );
警报触发如下:start
、cats
、finish
。 cats
出现在 finish
之前的事实证明消息是在代码执行时被添加到事件循环中的,而不是之后。
在 Javascript 中,每当调用异步 operation/event 时,都会创建一条消息以及 operation/event 的回调函数(该函数仅在 operation/event 完成后运行).
当 operation/event 完成(或触发)时,消息移至消息队列。不断轮询此消息队列(此轮询称为 "the event loop"),当在队列中找到消息时,消息的回调将放在调用堆栈上并运行。然后我们 return 进入事件循环并等待新消息或获取队列中的下一条消息并运行其回调。
我的问题是:在所有这一切之前,当一个 JavaScript 文件第一次运行时,在事件循环启动之前所有的东西都在同一个调用堆栈上运行吗?
这是一个非常有趣的问题。毫无疑问,有人会提供更好的解释,因为我不完全理解发生了什么,但根据我的测试,我确定你的问题的答案是否定的。
以下面的代码为例:
alert( 'start' );
var cats = document.getElementById( 'cats' );
cats.addEventListener('click', function() {
alert( 'cats' );
});
cats.click();
alert( 'finish' );
警报触发如下:start
、cats
、finish
。 cats
出现在 finish
之前的事实证明消息是在代码执行时被添加到事件循环中的,而不是之后。