Skip to content

前言

每个执行上下文,都有三个重要属性

  • 变量对象(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

js
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 的时候,其值会被隐式转换为全局对象。