JavaScript深入之从ECMAScript规范解读this

来源:http://www.sh-fengwen.com 作者:瘦身美容 人气:177 发布时间:2019-11-26
摘要:JavaScript 深入之从 ECMAScript 规范解读 this 2017/05/17 · JavaScript· this 原文出处: 冴羽    已离开简书,原因参见http://www.jianshu.com/p/0f12350a6b66。 前言 在《JavaScript深入之执行上下文栈》中讲

JavaScript 深入之从 ECMAScript 规范解读 this

2017/05/17 · JavaScript · this

原文出处: 冴羽   

已离开简书,原因参见 http://www.jianshu.com/p/0f12350a6b66。

前言

在《JavaScript深入之执行上下文栈》中讲到,当JavaScript代码执行一段可执行代码(executable code)时,会创建对应的执行上下文(execution context)。

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

  • 变量对象(Variable object,VO)
  • 作用域链(Scope chain)
  • this

今天重点讲讲this,然而不好讲。

……

因为我们要从ECMASciript5规范开始讲起。

先奉上ECMAScript 5.1规范地址:

英文版:

中文版:

让我们开始了解规范吧!

虽人微言轻,但也要有自己的态度。

Types

首先是第8章Types:

Types are further subclassified into ECMAScript language types and specification types.

An ECMAScript language type corresponds to values that are directly manipulated by an ECMAScript programmer using the ECMAScript language. The ECMAScript language types are Undefined, Null, Boolean, String, Number, and Object.

A specification type corresponds to meta-values that are used within algorithms to describe the semantics of ECMAScript language constructs and ECMAScript language types. The specification types are Reference, List, Completion, Property Descriptor, Property Identifier, Lexical Environment, and Environment Record.

我们简单的翻译一下:

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类型。

文章可以在我的 Github https://github.com/mqyqingfeng/Blog 查看

Reference

那什么又是Reference?

让我们看8.7章 The Reference Specification Type:

The Reference type is used to explain the behaviour of such operators as delete, typeof, and the assignment operators.

所以Reference类型就是用来解释诸如delete、typeof以及赋值等操作行为的。

抄袭尤雨溪大大的话,就是:

这里的 Reference 是一个 Specification Type,也就是 “只存在于规范里的抽象类型”。它们是为了更好地描述语言的底层行为逻辑才存在的,但并不存在于实际的 js 代码中。

再看接下来的这段具体介绍Reference的内容:

A Reference is a resolved name binding.

A Reference consists of three components, the base value, the referenced name and the Boolean valued strict reference flag.

The base value is either undefined, an Object, a Boolean, a String, a Number, or an environment record (10.2.1).

A base value of undefined indicates that the reference could not be resolved to a binding. The referenced name is a String.

这段讲了Reference有三个组成部分,分别是:

  • base value
  • referenced name
  • strict reference

而且base value是undefined, an Object, a Boolean, a String, a Number, or an environment record其中的一种

reference name是字符串。

可是这些到底是什么呢?

让我们简洁的理解base value是属性所在的对象或者就是EnvironmentRecord,referenced name就是属性的名称

嗯,举个例子:

var foo = 1; var fooReference = { base: EnvironmentRecord, name: 'foo', strict: false };

1
2
3
4
5
6
7
var foo = 1;
 
var fooReference = {
  base: EnvironmentRecord,
  name: 'foo',
  strict: false
};

再举个例子:

var foo = { bar: function () { return this; } }; foo.bar(); // foo var fooBarReference = { base: foo, propertyName: 'bar', strict: false };

1
2
3
4
5
6
7
8
9
10
11
12
13
var foo = {
  bar: function () {
    return this;
  }
};
foo.bar(); // foo
 
var fooBarReference = {
  base: foo,
  propertyName: 'bar',
  strict: false
};

而且规范中还提供了可以获取Reference组成部分的方法,比如 GetBase 和 IsPropertyReference

这两个方法很简单,简单看一看:

1.GetBase

GetBase(V). Returns the base value component of the reference V.

返回reference的base value

2.IsPropertyReference

IsPropertyReference(V). Returns true if either the base value is an object or HasPrimitiveBase(V) is true; otherwise returns false.

简单的理解:base value是object,就返回true

本文由美高梅游戏平台网站发布于瘦身美容,转载请注明出处:JavaScript深入之从ECMAScript规范解读this

关键词:

上一篇:移动混合开发之HTML5在移动开发中的准则

下一篇:没有了

最火资讯