事件队列中的JavaScript函数不存在';无法按预期移动到调用堆栈

事件队列中的JavaScript函数不存在';无法按预期移动到调用堆栈,javascript,asynchronous,Javascript,Asynchronous,我创建了两个JS程序来测试JavaScript调用堆栈、事件队列和计时器请求处理程序异步API的性质 情景1 函数logFirst(){ console.log('First'); } 函数logThird(){ 对于(var i=0;i 在logThird完成执行之后和logFourth被推送到调用堆栈之前,调用堆栈将为空 不,仍然有全局执行上下文(堆栈帧)运行脚本,并通过调用它在堆栈上实际推送logFourth。如果没有这样的东西(不可否认,它不是函数执行上下文),脚本的每个语句都必须经过

我创建了两个JS程序来测试JavaScript调用堆栈、事件队列和计时器请求处理程序异步API的性质

情景1

函数logFirst(){
console.log('First');
}
函数logThird(){
对于(var i=0;i
在logThird完成执行之后和logFourth被推送到调用堆栈之前,调用堆栈将为空

不,仍然有全局执行上下文(堆栈帧)运行脚本,并通过调用它在堆栈上实际推送
logFourth
。如果没有这样的东西(不可否认,它不是函数执行上下文),脚本的每个语句都必须经过事件循环本身

在logThird完成执行之后和logFourth被推送到调用堆栈之前,调用堆栈将为空


不,仍然有全局执行上下文(堆栈帧)运行脚本,并通过调用它在堆栈上实际推送
logFourth
。如果没有这样的东西(不可否认,它不是函数执行上下文),脚本的每个语句都必须经过事件循环本身

“由于浏览器中的所有JavaScript都在单线程上执行,因此异步事件(如鼠标单击和计时器)仅在执行过程中出现漏洞时运行。"-从这篇文章中-是什么让你认为在
logThird
之后调用堆栈是空的-你仍然在运行脚本的代码块中,不是吗?@JamesThorpe但脚本本身不是函数,是吗?调用堆栈只是用于单个指令或函数,不是吗?@Craicerjack我理解这句话。我的前提是on是指在执行过程中,在执行
LogThird()
函数和执行
LogFourth()函数之间有一个开口
函数,在第二个代码段中。但在相同的前提下,只要
setTimeout
返回,调用堆栈上就会有一个开口,并且在这两种情况下,超时应该在
logThird
运行之前立即运行。您只考虑显式调用函数时创建的堆栈帧,而忽略初始帧“由于浏览器中的所有JavaScript都在单线程上执行异步事件(如鼠标单击和计时器),因此只有在执行过程中出现漏洞时才会运行异步事件。”-从这篇文章中-是什么让你认为在
logThird
之后调用堆栈是空的-你仍然在运行脚本的代码块中,不是吗?@JamesThorpe但脚本本身不是函数,是吗?调用堆栈只是用于单个指令或函数,不是吗?@Craicerjack我理解这句话。我的前提是on是指在执行过程中,在执行
LogThird()
函数和执行
LogFourth()函数之间有一个开口
函数,在第二个代码段中。但在相同的前提下,只要
setTimeout
返回,调用堆栈上就会有一个开口,并且在这两种情况下,超时应该在
logThird
运行之前立即运行。您只考虑显式调用函数时创建的堆栈帧,而忽略初始帧为运行整个脚本而创建的堆栈框架。我根本不知道全局执行上下文。感谢您清除它!我根本不知道全局执行上下文。感谢您清除它!