绑定语法,首先是第 巴黎人澳门官网:8 章 Typ
分类:巴黎人-前端

JavaScript 深入之从 ECMAScript 规范解读 this

2017/05/17 · JavaScript · this

原文出处: 冴羽   

之前都是根据函数的使用情况来理解this,分为四种情况:

原文出处

JavaScript深入之从ECMAScript规范解读this
ECMA-262-3 in detail. Chapter 3. This
ECMAScript5.1中文版
ECMAScript5.1英文版

大家好,我是IT修真院深圳分院第06期学员,一枚正直善良的web程序员。

1. “::” 操作符

this绑定语法,提供了一种新的操作符::,用于进行便捷的this绑定。

主要有以下两种用法:
(1)串联

import { map, takeWhile, forEach } from "iterlib";

getPlayers()
::map(x => x.character())
::takeWhile(x => x.strength > 100)
::forEach(x => console.log(x));

(2)单独使用

Promise.resolve(123).then(::console.log);

单独使用时,::后面必须是x.yx[y]super.xsuper[x]的形式,
否则会报Syntax Error,以下语法规则说明了这一点。

BindExpression :
<i>    </i>:: MemberExpression

  • It is a Syntax Error if the derived MemberExpression is not
    MemberExpression : MemberExpression . Identifier,
    MemberExpression : MemberExpression [ Expression ],
    or SuperProperty
  • It is a Syntax Error if the derived NewExpression is PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList and CoverParenthesizedExpressionAndArrowParameterList ultimately derives a phrase that, if used in place of NewExpression, would produce a Syntax Error according to these rules. This rule is recursively applied.

<u></u>

SuperProperty :
super [ Expression ]
super . IdentifierName


前言

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

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

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

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

……

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

先奉上ECMAScript 5.1规范地址:

英文版:

中文版:

让我们开始了解规范吧!

  • 1、作为对象方法调用
  • 2、作为普通函数调用
  • 3、构造器调用
  • 4、Function.prototype.call或Function.prototype.apply调用
    但是今天看到了一篇文章,是追根溯源的从 ECMASciript 规范讲解 this 的指向,读完感觉收获很大,赶紧记录下来。

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。

没懂?没关系,我们只要知道在 ECMAScript 规范中还有一种只存在于规范中的类型,它们的作用是用来描述语言底层行为逻辑

今天给大家分享一下,修真院官网JS任务中可能会使用到的知识点:

2. The Reference Specification Type

The Reference Specification Type,是一个语言规范内置的类型(ECMAScript Specification Types)。

Reference Specification Type包含两种值,ReferenceSuper Reference
(1)Reference是一种数据结构,包括base valuereferenced name
以及strict reference flag三个组成部分。

(2)Super Reference,多了一个thisValue字段,
用于处理super()以及super.method()调用过程。

The base value component is either undefined, an Object, a Boolean, a String, a Symbol, a Number, or an Environment Record.
The referenced name component is a String or Symbol value.

与之相关联有几个函数,下文会用到:
(1)GetBase(V)会返回一个Reference的base value

(2)GetValue用于获取词法环境中绑定的值,或者对象的属性值。

巴黎人澳门官网 1

(3)GetThisValue,对于Reference则返回base value
否则对于Super Reference则返回它的thisValue字段。

巴黎人澳门官网 2


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

了解规范

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

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 的构成,由三个组成部分,分别是:

  1. base value: 就是属性所在的对象或者就是 EnvironmentRecord,它的值只可能是 undefined, an Object, a Boolean, a String。

  2. referenced name: 就是属性的名称。

  3. strict reference: 是否处于严格模式。

举个例子:

var foo = 1;

// 对应的Reference是:
var fooReference = {
    base: EnvironmentRecord,
    name: 'foo',
    strict: false
};

再举个例子:

var foo = {
    bar: function () {
        return this;
    }
};

foo.bar(); // foo

// bar对应的Reference是:
var BarReference = {
    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

  1. IsPropertyReference

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

简单的理解:如果 base value 是一个对象,就返回true

简述Js中this的指向


2. 绑定规则

本文由巴黎人手机版发布于巴黎人-前端,转载请注明出处:绑定语法,首先是第 巴黎人澳门官网:8 章 Typ

上一篇:看看最新的实用HTML5和CSS3框架吧巴黎人澳门官网 下一篇:没有了
猜你喜欢
热门排行
精彩图文