活动对象(AO)在函数被调用时创建,执行结束后销毁,但若被闭包引用则不销毁;它包含arguments、形参、函数声明和var变量,是执行上下文的一部分,不可直接访问。

函数执行上下文的活动对象(AO)在函数执行完全结束后被销毁,前提是该函数没有被闭包引用。
活动对象何时创建
AO 是函数执行上下文的一部分,在函数被调用时(即入栈瞬间)创建,而非定义时。它包含:
- arguments 对象(含实参值与 length 属性)
- 形参名(以参数名作为属性,值为传入实参)
- 函数声明(函数名 → 函数体引用,可覆盖同名声明)
- var 变量声明(变量名 → undefined,不重复覆盖已有同名属性)
销毁的触发条件
AO 销毁发生在函数执行流自然退出时,包括以下情况:
- 函数末尾语句执行完毕(隐式 return undefined)
- 遇到 return 语句并完成返回值计算后
- 抛出未被捕获的异常导致上下文提前终止
此时,该函数的执行上下文从执行栈中弹出,其 AO 所占内存标记为可回收。
闭包会阻止 AO 销毁
若函数内部返回了另一个函数,且该内层函数引用了外层函数的局部变量,则外层函数的 AO 不能被销毁——因为它的变量仍被内层函数的作用域链所持有。
例如:
function outer() {let x = 10;
return function inner() { return x; };
}
const fn = outer(); // outer 的 AO 不销毁,x 仍存活
注意:AO ≠ 变量本身
AO 是一个内部管理对象,开发者无法直接访问。销毁 AO 并不等于立即清除内存中的变量值,而是解除执行上下文对这些值的引用关系。是否真正释放内存,取决于 JS 引擎的垃圾回收机制(如标记-清除)是否判定这些值已不可达。

















