javascript – 全局执行上下文是否可以弹出执行堆栈?

当JS代码开始运行时,全局执行上下文被创建并位于执行堆栈的底部,以“容纳”全局变量对象和’这’.
如果在执行整个JS代码并且没有全局执行上下文后执行堆栈变空,那么我们如何仍然能够访问全局变量(例如,我正在运行带有JS的html文件)代码和完成后,我仍然能够通过Chrome控制台看到全局变量的值…)或者它如何仍然指向全局对象(如果没有任何执行上下文,则不应该有任何’this’ !)?

我可能给自己的唯一解释是全局执行上下文永远不会离开执行堆栈;它一直存在,直到我决定关闭浏览器窗口.我是对还是不对?

此外,在异步回调的情况下,当一个事件离开事件队列并进入JS引擎运行时,执行堆栈中究竟发生了什么?回调的执行上下文是否位于此堆栈的底部,还是全局执行上下文仍然存在?

一个类似的主题Is the initial global execution context ever popped off the call stack in JavaScript?;但是,它没有回答我的问题.

谢谢

解决方法

运行整个代码时,执行堆栈变空.

how are we still able to access the global variables?

即使没有执行代码,the global lexical environment仍然存在全局对象.当你喂一些代码到镀铬的控制台,代码正在评估,新的全球execution contextbeing created and initialized设置为全球环境及其词汇和可变的环境,这个绑定到全局对象.然后,您的代码在此上下文中执行,执行堆栈再次变为空.

how this still points to global object?

每次使用全局代码初始化新的全局执行上下文时,它都会绑定到全局对象.

in case of asynchronous callbacks,when an event gets out of the event queue and gets into JS engine as to be run,what exactly happens in the execution stack?

同样,创建新的全局执行上下文并将其推送到空执行堆栈.在MDN中,与ECMAScript spec略有不同的描述:

When the stack is empty,a message is taken out of the queue and processed. The processing consists of calling the associated function (and thus creating an initial stack frame). The message processing ends when the stack becomes empty again. (07005)

这里“堆栈帧”表示“执行上下文”,“初始堆栈帧”对应于“全局执行上下文”.

Is the callback’s execution context sitting at the bottom of this stack or the global execution context is still there?

他们都不是.堆栈是空的.并且只有它是空的,最旧的回调是从回调/事件队列中获取的:

When there is no running execution context and the execution context stack is empty,the ECMAScript implementation removes the first PendingJob from a Job Queue and uses the information contained in it to create an execution context and starts execution of the associated Job abstract operation. 07006

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


什么是深拷贝与浅拷贝?深拷贝与浅拷贝是js中处理对象或数据复制操作的两种方式。‌在聊深浅拷贝之前咱得了解一下js中的两种数据类型:
前言 今天复习了一些前端算法题,写到一两道比较有意思的题:重建二叉树、反向输出链表每个节点 题目 重建二叉树: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列 {1,2,4,7,3,5,6,8} 和中序遍历序列 {
最近在看回JavaScript的面试题,this 指向问题是入坑前端必须了解的知识点,现在迎来了ES6+的时代,因为箭头函数的出现,所以感觉有必要对 this 问题梳理一下,所以刚好总结一下JavaScript中this指向的问题。
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)