从ECMAScript规范解读this,深入之从

JavaScript 深刻之从 ECMAScript 规范解读 this

2017/05/17 · JavaScript
· this

初稿出处: 冴羽   

已离开简书,原因参见
http://www.jianshu.com/p/0f12350a6b66从ECMAScript规范解读this,深入之从。。

后面都以基于函数的使用状态来了然this,分为多种状态:

先是推荐阅读冴羽的:JavaScript深刻之从ECMAScript规范解读this

前言

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

对此种种执行上下文,都有七个主要性质

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

今天重中之重讲讲this,但是不佳讲。

……

因为我们要从ECMASciript5行业内部起来讲起。

先奉上ECMAScript 5.1正经地点:

英文版:

中文版:

让咱们开端理解规范吧!

虽微不足道,但也要有友好的态度。

  • 一 、作为靶子方法调用
  • 二 、作为一般函数调用
  • 叁 、构造器调用
  • 4、Function.prototype.call或Function.prototype.apply调用
    可是前天来看了一篇作品,是追根溯源的从 ECMASciript 规范教学 this
    的针对性,读完感觉获得十分大,赶紧记录下来。

基本概念在此地讲的很清楚,只是看完后思绪整理起来有个别乱,整理了一张图

Types

首先是第十章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
查看

打探规范

英文版:http://es5.github.io/\#x15.1
中文版:http://yanhaijing.com/es5/\#115

图片 1

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 是1个 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

1、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直接操作的类别。ECMAScript语言类型是Undefined,Null,Boolean,String,
Number, 和Object。

正规类型也便是meta-values,用来用算法来讲述ECMAScript
语言结构和语言类型的。规范类型是:Reference,List,Completion,Property
Descriptor,Property Identifier, Lexical Environment, and Environment
Record。

大家必要知道在 ECMAScript
规范中还有一种只存在刘恒式中的类型,它们的作用是用来描述语言底层行为逻辑。

相关文章