javascript - JS 执行上下文完成后是否会保留在内存中(如果对其中创建的词法环境的引用仍然存在)?
问题描述
还是执行上下文对象被垃圾回收,只留下仍被引用的词法环境对象(即被闭包引用)?
即左侧的执行上下文对象在从堆栈中弹出时是否会被垃圾收集,而如果被闭包引用,[[Environment]] 是否仍然存在?
还想知道:
ExecutionContext a) 创建全局/窗口/模块类型对象并 b) 将其“this”属性的值设置为指向它。(全局和窗口是 ExecutionContext 的属性)。
还是 ExecutionContext == 全局和窗口类型的对象?
解决方案
一个变量将保留在内存中,直到至少有一个标识符链接到它。如果您在闭包中有一些变量,它们将保留在内存中,直到该闭包处于活动状态。
function foo() {
const a = 1;
const b = 2;
return function boo() {
return a + b;
}
}
const moo = foo() //moo is now linked to the boo closure
在示例中,所有链接都以这种方式出现:
- moo与boo相关联
- boo链接到它自己的 Lexical Environment 对象
- boo 的词法环境包含作用域(链接到外部 foo 的词法环境)
- 由于变量a和b在boo中使用,它们也存储在内存中。foo 的词法环境包含指向a和b的链接
因此,只要有moo,变量a和b就会存储在内存中。在这种情况下,我们可以将 moo 设置为null。在此之后,垃圾收集器将无法从根到达 a 和 b。这意味着变量将被自动删除。
推荐阅读
- c++ - Boost Iostreams component() 调用失败
- c# - 如何处理asp.net中的textchange事件
- android-studio - 我无法更改英特尔 HAXM 设置
- c++ - 包括简单 C++ TensorFlow Lite 测试程序的特征在内的问题
- android - 我没有在我的应用程序中使用“android.permission.SEND_SMS”权限
- android - Android 联系人在后台同步
- javascript - 如何使用jquery根据标签文本的升序对多个下拉列表进行排序
- android - 在android studio中创建项目时这个错误是什么我无法理解
- java - 如何固定响应时间以在 Java 中调用 REST API?
- php - 如何将一行连接到数据库中的表?