Lexical Environment与Global Environment的区别及从属关系确认
词法环境与全局环境的区别答疑
你的推断完全正确,全局环境本身就是词法环境的一种特殊实现,属于词法环境的范畴,二者不是平级的并列关系,而是通用结构和特殊顶层实例的关系。
基础定义先对齐
根据ECMAScript官方规范的定义:
- 词法环境是JS用来管理作用域的通用基础结构,所有作用域对应的上下文都符合这个结构,固定包含两部分:
- 环境记录:存储当前作用域内声明的变量、函数的实际取值
- 外部引用:指向父级词法环境的指针,我们常说的作用域链就是靠这个指针逐层串联起来的
- 全局环境是脚本初始化时就会创建的顶层词法环境,完全符合词法环境的所有结构要求,你提到的「全局声明的函数的外部引用指向的是词法环境」就是非常直接的佐证,这个引用指向的就是全局词法环境。
全局环境和普通词法环境的核心差异
全局环境只有几个特殊的点和普通词法环境做区分:
- 是所有作用域链的最顶端,没有父级环境,它的外部引用固定为
null - 它的环境记录会绑定宿主环境提供的全局API(比如浏览器的
window、Node.js的global),顶层用var声明的变量、function声明的函数会自动成为全局对象的属性 - 生命周期最长,从程序启动时创建,直到程序退出/页面卸载才会销毁;普通词法环境(比如函数执行时创建的内部词法环境)如果没有被闭包引用,执行完毕就会被垃圾回收。
内容的提问来源于stack exchange,提问作者AngryJohn
相关产品推荐
相关产品推荐

