调用堆栈中导出模块的执行上下文

问题描述 投票:0回答:1

考虑以下代码:

moduleA.js:

// moduleA.js
export const moduleVarA = "I am from moduleA";
export function greetA() {
    console.log("Hello from moduleA");
}

moduleB.js:

// moduleB.js
import { moduleVarA, greetA } from './moduleA.js';

console.log(moduleVarA); // "I am from moduleA"
greetA(); //"Hello from moduleA"

我想问一下上述模块在调用栈中的执行上下文的顺序是怎样的?我的意思是,在加载并执行模块 A 后,其执行上下文会从调用堆栈中弹出,还是会保留在那里,直到所有导入模块(如 moduleB)的执行上下文完成?

javascript es6-modules
1个回答
0
投票

在 moduleB 代码导入 moduleA 后,moduleA 的执行上下文不再可用。该执行上下文仅在 moduleA 初始化代码运行时存在,而不是在运行之后。

在 moduleA 代码中创建的任何未存储在 moduleA 代码可访问的持久位置的任何内部引用,一旦 moduleA 的初始化代码完成,都将有资格进行垃圾回收。

需要注意的一件事是,闭包(通常是在另一个函数中声明函数时创建的,然后将该内部函数的引用传递给外部世界,以便它持续存在),使得内部函数仍然可以被调用,这可能会导致内部函数变量保留,并且执行上下文或上下文的一部分不会被垃圾收集。 您在问题的代码中没有显示任何此类示例。

© www.soinside.com 2019 - 2024. All rights reserved.