javascript 中的[[scope]]和LexicalEnvironment

阅读 5.2k
3 个回答

请看文中第二节的第一句话:

When the function runs, on every function call, the new LexicalEnvironment is created and populated with arguments, variables and nested function declarations.

所以此文的作者认为在js中,LexicalEnvironment是个对象,它保存了作用域的信息,也就是题主所说的[[scope]],包括此作用域下的参数、变量以及嵌套(链式)的函数作用域信息。另外下面这句话也是佐证之一。

The top-level LexicalEnvironment in browser is window. It is also called a global object.

两者还是不一样的,虽然从技术实现的本质来看,区别不大。并且从定义角度来看都是定义了在ECMAScript 嵌套词法结构上标识符与变量值和函数的关联关系。
但其中有一点很重要,词法环境是支持词法地址,虽然在规范中并没有提到,但老版通过变量对象实现的显然不支持的。此外,词法地址的抽象角度更高,更适合描述es的目前内容。
还有很重要的,词法环境的组成也发生了很大变化,词法环境是由环境记录项和一个指向外部环境的outter属性组成。环境记录项里面包括内容可以类比为ES3中的变量对象。而[[scope]]中变量对象不是这样。
如果要详细了解,可以看看执行上下文,从执行上下文角度来看,目前执行上下文组成已经变了词法环境,变量环境加this绑定,每一个都与过去不同。
词法环境和变量环境中的函数声明(FD)和函数表达式(FE)中[[scope]]值的不同。
另外,在严格模式下,有很多内容都发生了改变。

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