在 JavaScript 中,向没有声明的变量名赋值,会隐式地创建一个全局变量;全局变量会被绑定为全局对象(global)的属性。因此,JavaScript 的变量环境(或者全局环境)与对象系统就关联了起来。而对象闭包和函数闭包实现的环境被称为域(Scope)。所谓“使用 with 语句创建一个对象闭包”就简单地被实现为“向既有的作用域链尾加入一个新的 scope”。
在 JavaScript 1.3 时代的执行环境,就是一个闭包链的管理。这种闭包既可以是对象的,也可以是函数的。在静态语法说明或描述时,其被称为作用域或域(Scope);在动态环境中则被称为上下文(Context)。
在 JavaScript 中的对象本质上是属性集,这可以视为一个键值列表,而对象继承是由这样的列表构成的、称为原型的链。另一方面,执行的上下文就是函数或全局的变量表,这同样可以表达为一个键值列表,而执行环境也可以视为一个由该键值列表构成的链。
在 JavaScript 中任何对象都有“constructor”这个属性,缺省指向创建它的构造器函数。ECMAScript 约定了所谓的“属性的性质(attributes)”,也就是可写性 writable、可列举性 enumerable 和可配置性 configurable。其中可列举性 enumerable 可以简单地理解为“一个属性是否能用 for…in 语句列举出来”,因此它也被称作可见性。ECMAScript 统一使用“属性描述符”来管理这些性质(可以通过 Object.defineProperty 读取和更改),并且 ECMAScript 约定:
1. “constructor”缺省是一个不可列举的属性;
2. 使用赋值表达式添加属性时,属性的可列举性缺省为true。
----- 极客时间 《JavaScript 核心原理解析》学习笔记 Day 13 -----