【发布时间】:2020-01-03 09:33:22
【问题描述】:
我不明白为什么一个未执行的闭包可以捕获外部变量。
我确实读过一些关于execute context、lexical environment、memory management 的文章,但这些都不能解决我的问题:
function foo() {
var a = 1;
return function() {
console.log(a);
}
}
var f = foo() // line 7
// HERE variable a was been captured
f = undefined // line 10
// HEAE variable a was been released
当引擎执行到第7行时,foo execution context在global execution context之上创建,但在第7行之后,闭包从未被执行,因此闭包执行上下文从未被创建,词法环境也是如此。 foo execution context被弹出,变量a将被释放。
我找不到我的观点有什么问题。 那么为什么以及何时捕获闭包中的变量呢?
【问题讨论】:
-
如果
f()被调用,你预计什么时候会捕获变量? -
闭包是在你调用
foo()时创建的。它怎么知道你永远不会使用它? -
@Bergi 再问一个问题:ExecutionContext 是在函数调用时还是函数声明时创建的?
-
@Barmar ExecutionContext 在函数调用时或函数声明时创建?
-
@TaoPaipai 调用函数时会创建执行上下文(“堆栈帧”)。但是在创建函数时,会在函数对象上捕获词汇环境(“范围”)。
标签: javascript node.js garbage-collection closures v8