关于js闭包

有如下代码:

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 字段?

这个问题是在掘金上一个关于闭包的文章评论区看到的,但是当时讨论的并不清楚,希望知道这个原因的同学不吝赐教!谢谢。

阅读 1.6k
2 个回答

执行上下文中的变量,有两种状态unreachablenotused,当两者都为true的时候,变量就会被回收,例子中的a和c被fn3使用了,所以其unreachable为false,而不论fn3是不是被用到了(因为有递归的情况,所以不判断)

fn2 没有用 fn1 里的变量,并不等于 fn1 这个 scope 就不存在啊。它永远会在那里,用不用是你的事。


就像你也没有用 Global ,Global 不也在那里嘛 ...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏