ES6中的块级作用域,在内存中是如何实现的?

新手上路,请多包涵

先上代码

let a = "top";
var fn;

{
    let a = "level1";
    fn = function(){
         console.log(a);
    }
}
fn(); // 输出的结果是: level1

这是一段有关ES6中块级作用域的代码。我的问题是:
1.块级作用域,不应该是出了块后,就消失了吗?为何我在块外调用fn()的时候,依然可以找到那个块级作用域?
2.let 产生的块级作用域,在内存中,到底是如何工作的?

想了两天了,也查了不少资料,但对于块级作用域的介绍,好像不是很全,尤其是从内存角度的分析。

阅读 2.4k
4 个回答

fn变量不是在块外吗?块内因为闭包能对fn赋值很正常呀

fn里能打印a也是因为闭包可见呀

至于块只是扩展了一下闭包的限制,内存上没有什么区别,该标记标记,该回收回收

个人认为题主说的这个问题和闭包还是有区别的,从开发工具来看并不是像函数闭包(Closure)把依赖的变量包在一起存在内存里,更像是记录了块中的状态再复原

函数闭包Closure

块作用域 Block Scope

有点怀疑对于块作用域创建了块内的 Environment Record,然后 fn 的 [[outerEnv]] 指向了这个 Environment Record

底层原理或许知乎会有更多解答资源

用我的 babel 配置编译至 ES5 的块级作用域差不多是这样的:

;(function(){
    var a = "level1";
    // ...
})();

所以你就把它看作是一个立即执行的函数,然后套用函数作用域的特性就行了。

作用域看的是变量定义的地方, 不是赋值的地方.

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