前言
每个执行上下文,都有三个重要属性
- 变量对象(Variable object,VO)
- 作用域链(Scope chain)
- this
重点讲讲this
先奉上 ECMAScript 5.1 规范地址:http://yanhaijing.com/es5/#115
tyes
ECMAScript 的类型分为语言类型和规范类型。
ECMAScript 语言类型是开发者直接使用 ECMAScript 可以操作的。其实就是我们常说的Undefined, Null, Boolean, String, Number, 和 Object。
而规范类型相当于 meta-values,是用来用算法描述 ECMAScript 语言结构和 ECMAScript 语言类型的。规范类型包括:Reference, List, Completion, Property Descriptor, Property Identifier, Lexical Environment, 和 Environment Record。
Reference
Reference 类型就是用来解释诸如 delete、typeof 以及赋值等操作行为的。 Reference 由三个组成部分
- base value
就是属性所在的对象或者就是 EnvironmentRecord,它的值只可能是 undefined, an Object, a Boolean, a String, a Number, or an environment record 其中的一种。
- referenced name
就是属性的名称
- strict reference
规范中还提供了获取 Reference 组成部分的方法,比如 GetBase 和 IsPropertyReference。
- GetBase 返回 reference 的 base value。
- IsPropertyReference 如果 base value 是一个对象,就返回true;
GetValue
8.7.1 章规范中就讲了一个用于从 Reference 类型获取对应值的方法: GetValue
var foo = 1;
var fooReference = {
base: EnvironmentRecord,
name: 'foo',
strict: false
};
GetValue(fooReference) // 1;
调用 GetValue,返回的将是具体的值,而不再是一个 Reference
如何确定this的值
1.计算 MemberExpression 的结果赋值给 ref
2.判断 ref 是不是一个 Reference 类型
1 如果 ref 是 Reference,并且 IsPropertyReference(ref) 是 true, 那么 this 的值为 GetBase(ref)
2 如果 ref 是 Reference,并且 base value 值是 Environment Record, 那么this的值为 ImplicitThisValue(ref)
3 如果 ref 不是 Reference,那么 this 的值为 undefined
this 为 undefined,非严格模式下,this 的值为 undefined 的时候,其值会被隐式转换为全局对象。