规范解读,从ECMAScript规范解读this

JavaScript 深刻之从 ECMAScript 规范解读 this

2017/05/17 · JavaScript
· this

初稿出处: 冴羽   

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

之前都以基于函数的利用情况来通晓this,分为多种意况:

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

前言

在《JavaScript浓厚之实践上下文栈》中讲到,当JavaScript代码执行壹段可实施代码(executable
code)时,会创立对应的执行上下文(execution context)。

对于每一个执行上下文,都有多少个首要性质

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

前天第三讲讲this,不过倒霉讲。

……

因为我们要从ECMASciript伍标准发轫讲起。

先奉上ECMAScript 5.壹正规位置:

英文版:

中文版:

让大家开首询问规范吧!

虽微不足道,但也要有温馨的态势。

  • 1、作为目的方法调用
  • 二、作为普通函数调用
  • 三、构造器调用
  • 4、Function.prototype.call或Function.prototype.apply调用
    而是今天看看了一篇文章,是追根溯源的从 ECMASciript 规范教学 this
    的指向,读完感觉得到十分的大,赶紧记录下来。

基本概念在此间讲的很精通,只是看完后思绪整理起来有点乱,整理了一张图

Types

先是是第10章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?

让我们看八.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是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
规范中还有一种只存在江小鱼式中的类型,它们的作用是用来描述语言底层行为逻辑。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图