有如下代码:
function fn1 () {
const a = 1;
const b = 2;
const c = 3;
function fn2() {
console.log("xx");
}
function fn3() {
console.log(a);
console.log(c);
}
return fn2;
}
const clo = fn1();
console.dir(clo);
在 chrome 控制台执行这段代码时,会有下面的情况:
上面代码中,fn3 对 fn1 的变量进行了引用,我们只 return 了 fn2,为什么 fn2 的 [[Scopes]]
中出现了 Closure 字段?
这个问题是在掘金上一个关于闭包的文章评论区看到的,但是当时讨论的并不清楚,希望知道这个原因的同学不吝赐教!谢谢。
执行上下文中的变量,有两种状态
unreachable
和notused
,当两者都为true的时候,变量就会被回收,例子中的a和c被fn3使用了,所以其unreachable
为false,而不论fn3是不是被用到了(因为有递归的情况,所以不判断)