We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Lexical Environments是一种规范类型,用于根据ECMAScript代码的词法嵌套结构定义标识符与特定变量和函数的关联。一个词法环境由一个Environment Records和一个可能为空的外部词法环境的引用组成。通常,词法环境与ECMAScript代码的特定句法结构有关。例如函数申明,块语句,try语句中的catch等代码每次运算后会产生新的词法环境。
一条Environment Records记录在其关联词法环境作用域内创建的标识符绑定。它指向词法环境的EnvironmentRecord。
PS:便于理解,可以把词法环境间的嵌套看成 树结构。
外部环境引用用于模拟词法环境值的逻辑嵌套。内部词法环境的外部引用 是对一个逻辑上围绕内部词法环境的词法环境的引用(有点绕人)。外部词法环境也会有它自己的外部词法环境(就像树形结构一样,子父级关系)。一个词法环境可以作为多个内部词法环境的外部环境(类似有多个子级)。
全局环境 是一个没有外部词法环境的词法环境(看作树的根节点)。全局环境的外部环境引用是 null。全局环境的EnvironmentRecord可能预填充了标识符绑定,并包括一个关联的全局对象,该对象的属性提供了某些全局环境的标识符绑定。当ECMAScript代码执行时,可能会对全局对象增加额外的属性并且初始属性可能会被修改。
module 环境是一个包含了模块顶级申明绑定的词法环境。 它还包含模块显式引入的绑定。module 环境的外部环境是全局环境。
function环境是一个对应于ECMAScript函数对象调用的词法环境。函数环境可能建立一个新的 this绑定。函数环境还捕获支持 super 方法调用所需的状态。
Lexical Environments 和 Environment Record 的值是纯规范机制并且不需要与任何特定的ECMAScript实现对应。ECMAScript程序是无法直接获取或操作它们的值的。
规范中有两种主要的Environment Records值:declarative Environment Records 和 object Environment Records 。
声明性环境记录用于定义ECMAScript语言语法元素(例如FunctionDeclarations,VariableDeclarations和Catch)的效果,这些元素直接将标识符绑定与ECMAScript语言值相关联
对象环境记录用于定义ECMAScript元素(例如WithStatement)的效果,这些元素将标识符绑定与某些对象的属性相关联。
全局环境记录和函数环境记录专门用于脚本全局声明和函数内顶级声明。
出于规范目的,环境记录值是Record规范类型的值并且可以认为它存在于简单的面向对象的层次结构中,其中Environment Record是具有三个具体子类的抽象类,分别是declarative Environment Record, object Environment Record, 和 global Environment Record。
Function Environment Records 和 module Environment Records是declarative Environment Record子类。这些抽象类包含一些抽象的方法定义在下面表格中:
每个声明性环境记录都与包含变量(var),常量(const),let,类(class),模块(module),导入(import)和函数声明(function)的ECMAScript程序作用域相关联。声明性环境记录绑定在其作用域内声明的标识符集。
SetMutableBinding ( N, V, S )方法,在某些很罕见的情况下没有存在的绑定,例如:
function f() { eval("var x; x = (delete x, 0);"); }
每个对象环境记录与其绑定对象相关联。对象环境记录绑定 直接与其绑定对象的属性名称 相对应的一组字符串标识符名称。不是以IdentifierName形式出现的字符串的属性键不包含在绑定标识符集中。自有以及继承的属性都会被包含在该集合内,无论它们的[[Enumerable]]属性设置。由于对象属性可以动态增加和删除,对象环境记录所绑定的标识符集可能会因添加或删除属性的任何操作的副作用而发生更改。由于这种副作用而创建的任何绑定都被视为可变绑定,即使相应属性的Writable属性的值为 false 也不例外。对象环境记录中不存在不可变绑定。
为 with 语句创建的对象环境记录可以提供它们的绑定对象作为一个隐式 this 值在函数调用中使用。该功能由与每个对象环境记录关联的withEnvironment布尔值控制。 默认情况下,对于任何对象环境记录,withEnvironment的值为false。
全局环境记录用于表示在共同领域中处理的所有ECMAScript脚本元素共享的最外部作用域。全局环境记录为内置全局变量,全局对象的属性以及脚本中发生的所有顶级声明(13.2.8、13.2.10)提供了绑定。
逻辑上来说,全局环境记录是单个记录,但是它被指定为封装对象环境记录和声明性环境记录的 复合记录。对象环境记录将关联领域记录的全局对象作为其基对象。此全局对象是全局环境记录的GetThisBinding方法返回的值。全局环境记录的对象环境记录包含所有内置全局变量的绑定(第18节)以及全局代码中包含的FunctionDeclaration,GeneratorDeclaration,AsyncFunctionDeclaration,AsyncGeneratorDeclaration或VariableStatement引入的所有绑定。全局代码中所有其他ECMAScript声明的绑定包含在全局环境记录的声明性环境记录部分中。
GetThisBinding
可以直接在全局对象上创建属性。因此,全局环境记录的对象环境记录组件可能包含由FunctionDeclaration,GeneratorDeclaration,AsyncFunctionDeclaration,AsyncGeneratorDeclaration或VariableStatement声明显式创建的绑定,以及隐式创建为全局对象属性的绑定。为了识别使用声明显式创建的绑定,全局环境记录使用其CreateGlobalVarBinding和CreateGlobalFunctionBinding具体方法维护绑定名称的列表。
全局环境记录有额外的字段列表:
Function 环境记录是一个声明性环境记录,用于表示函数的顶级作用域并且如果该函数不是一个箭头函数,则会提供一个 this 绑定。如果该函数不是箭头函数且有 super 引用,它的function环境记录还包含用于从function内部执行 super 方法调用的状态。
下面是函数环境记录额外的字段列表:
lexical
undefined
newTarget
module 环境记录是一个声明性环境记录,用于表示ECMAScript Module的外部作用域。此外,对于通常可变以及不可变的绑定,module 环境记录也会提供不可变的导入绑定(提供对另一个环境记录中存在的目标绑定的间接访问的绑定)。
不全是。说环境记录是作用域可能更准确。 词法环境更像是作用域链。
来自高级前端面试小程序js基础第9题
var a = 10; (function() { console.log(a); // undefined a = 5; console.log(window.a); // 10 var a = 20; console.log(a); // 20 })()
The text was updated successfully, but these errors were encountered:
No branches or pull requests
Executable Code and Execution Contexts
Lexical Environments(词法环境)
Lexical Environments是一种规范类型,用于根据ECMAScript代码的词法嵌套结构定义标识符与特定变量和函数的关联。一个词法环境由一个Environment Records和一个可能为空的外部词法环境的引用组成。通常,词法环境与ECMAScript代码的特定句法结构有关。例如函数申明,块语句,try语句中的catch等代码每次运算后会产生新的词法环境。
一条Environment Records记录在其关联词法环境作用域内创建的标识符绑定。它指向词法环境的EnvironmentRecord。
外部环境引用用于模拟词法环境值的逻辑嵌套。内部词法环境的外部引用 是对一个逻辑上围绕内部词法环境的词法环境的引用(有点绕人)。外部词法环境也会有它自己的外部词法环境(就像树形结构一样,子父级关系)。一个词法环境可以作为多个内部词法环境的外部环境(类似有多个子级)。
全局环境 是一个没有外部词法环境的词法环境(看作树的根节点)。全局环境的外部环境引用是 null。全局环境的EnvironmentRecord可能预填充了标识符绑定,并包括一个关联的全局对象,该对象的属性提供了某些全局环境的标识符绑定。当ECMAScript代码执行时,可能会对全局对象增加额外的属性并且初始属性可能会被修改。
module 环境是一个包含了模块顶级申明绑定的词法环境。 它还包含模块显式引入的绑定。module 环境的外部环境是全局环境。
function环境是一个对应于ECMAScript函数对象调用的词法环境。函数环境可能建立一个新的 this绑定。函数环境还捕获支持 super 方法调用所需的状态。
Lexical Environments 和 Environment Record 的值是纯规范机制并且不需要与任何特定的ECMAScript实现对应。ECMAScript程序是无法直接获取或操作它们的值的。
Environment Records
规范中有两种主要的Environment Records值:declarative Environment Records 和 object Environment Records 。
声明性环境记录用于定义ECMAScript语言语法元素(例如FunctionDeclarations,VariableDeclarations和Catch)的效果,这些元素直接将标识符绑定与ECMAScript语言值相关联
对象环境记录用于定义ECMAScript元素(例如WithStatement)的效果,这些元素将标识符绑定与某些对象的属性相关联。
全局环境记录和函数环境记录专门用于脚本全局声明和函数内顶级声明。
出于规范目的,环境记录值是Record规范类型的值并且可以认为它存在于简单的面向对象的层次结构中,其中Environment Record是具有三个具体子类的抽象类,分别是declarative Environment Record, object Environment Record, 和 global Environment Record。
Function Environment Records 和 module Environment Records是declarative Environment Record子类。这些抽象类包含一些抽象的方法定义在下面表格中:
声明性环境记录(Declarative Environment Records)
每个声明性环境记录都与包含变量(var),常量(const),let,类(class),模块(module),导入(import)和函数声明(function)的ECMAScript程序作用域相关联。声明性环境记录绑定在其作用域内声明的标识符集。
对象环境记录(Object Environment Records)
每个对象环境记录与其绑定对象相关联。对象环境记录绑定 直接与其绑定对象的属性名称 相对应的一组字符串标识符名称。不是以IdentifierName形式出现的字符串的属性键不包含在绑定标识符集中。自有以及继承的属性都会被包含在该集合内,无论它们的[[Enumerable]]属性设置。由于对象属性可以动态增加和删除,对象环境记录所绑定的标识符集可能会因添加或删除属性的任何操作的副作用而发生更改。由于这种副作用而创建的任何绑定都被视为可变绑定,即使相应属性的Writable属性的值为 false 也不例外。对象环境记录中不存在不可变绑定。
为 with 语句创建的对象环境记录可以提供它们的绑定对象作为一个隐式 this 值在函数调用中使用。该功能由与每个对象环境记录关联的withEnvironment布尔值控制。 默认情况下,对于任何对象环境记录,withEnvironment的值为false。
Global Environment Records
全局环境记录用于表示在共同领域中处理的所有ECMAScript脚本元素共享的最外部作用域。全局环境记录为内置全局变量,全局对象的属性以及脚本中发生的所有顶级声明(13.2.8、13.2.10)提供了绑定。
逻辑上来说,全局环境记录是单个记录,但是它被指定为封装对象环境记录和声明性环境记录的 复合记录。对象环境记录将关联领域记录的全局对象作为其基对象。此全局对象是全局环境记录的
GetThisBinding
方法返回的值。全局环境记录的对象环境记录包含所有内置全局变量的绑定(第18节)以及全局代码中包含的FunctionDeclaration,GeneratorDeclaration,AsyncFunctionDeclaration,AsyncGeneratorDeclaration或VariableStatement引入的所有绑定。全局代码中所有其他ECMAScript声明的绑定包含在全局环境记录的声明性环境记录部分中。可以直接在全局对象上创建属性。因此,全局环境记录的对象环境记录组件可能包含由FunctionDeclaration,GeneratorDeclaration,AsyncFunctionDeclaration,AsyncGeneratorDeclaration或VariableStatement声明显式创建的绑定,以及隐式创建为全局对象属性的绑定。为了识别使用声明显式创建的绑定,全局环境记录使用其CreateGlobalVarBinding和CreateGlobalFunctionBinding具体方法维护绑定名称的列表。
全局环境记录有额外的字段列表:
Function Environment Records
Function 环境记录是一个声明性环境记录,用于表示函数的顶级作用域并且如果该函数不是一个箭头函数,则会提供一个 this 绑定。如果该函数不是箭头函数且有 super 引用,它的function环境记录还包含用于从function内部执行 super 方法调用的状态。
下面是函数环境记录额外的字段列表:
lexical
,则是箭头函数,没有thisundefined
newTarget
的值。否则,它的值为undefined
。Module Environment Records
module 环境记录是一个声明性环境记录,用于表示ECMAScript Module的外部作用域。此外,对于通常可变以及不可变的绑定,module 环境记录也会提供不可变的导入绑定(提供对另一个环境记录中存在的目标绑定的间接访问的绑定)。
词法环境是不是平常理解的作用域???
不全是。说环境记录是作用域可能更准确。
词法环境更像是作用域链。
2020-07-27 补充
来自高级前端面试小程序js基础第9题
The text was updated successfully, but these errors were encountered: