ECMA学习笔记

阅读数:665 发布时间:2016-09-28 23:30:07

作者:w4gyc 标签: ECMA 学习笔记

ECMA学习笔记

2013.06.24

An ECMAScript object is a collection of properties each with zero or more attributes that determine how each property can be used—...Properties are containers that hold other objects, primitive values, or functions. A primitive value is a member of one of the following built-in types: Undefined, Null, Boolean, Number, and String; an object is a member of the remaining built-in type Object; and a function is a callable object. A function that is associated with an object via a property is a method.

  1. object是property的集合。每个property都有0个或多个attribute用来控制property的行为。
  2. property可以包括other object、原始值(primitive value)或function。
  3. object是其它内置类型的成员之一,原始值(primitive value)是以下内置类型的成员之一:Undefined, Null, Boolean, Number, 以及String;函数(function)是一个可调用的对象。
  4. 如果一个函数作为一个对象的属性,则我们称为方法(method)。

ECMAScript defines a collection of built-in objects that round out the definition of ECMAScript entities. These built-in objects include the global object, the Object object, the Function object, the Array object, the String object, the Boolean object, the Number object, the Math object, the Date object, the RegExp object. .the JSON object and the Error objects.....

  1. ECMAScript定义了一系列内置对象(built-in objects )
  2. 内置对象包括:全局对象(global object,)……

Instead objects may be created in various ways including via a literal notation or via constructors which create objects and then execute code that initialises all or part of them by assigning initial values to their properties. Each constructor is a function that has a property named “prototype” that is used to implement prototype-based inheritance and shared properties. Objects are created by using constructors in new expressions; for example, new Date(2009,11) creates a new Date object. Invoking a constructor without using new has consequences that depend on the constructor. For example, Date() produces a string representation of the current date and time rather than an object.

  1. creat object : literal notation or constructors
  2. constructor ->property:prototype->(prototype-based & properties) 原型
  3. 构造函数:new

(原型什么的好难理解好么 - -!)(What is the consequences?)

a prototype may have a non-null implicit reference to its prototype, and so on; this is called the prototype chain.

(一个原型可能有一个非空的隐式指向它的原型,以此类推,这就是原型链。 - -不懂)

2013.06.25

隐式原型链和显示原型属性?前者是proto ,指向父对象 。后者是prototype属性。

一个内置对象即一个内置构造函数。构造函数具有prototype属性,当new一个object时,该object 隐式指向 constructor. prototype

值(value)是类型(type)的成员。object 是 constructor 的 实例

这文法整个看不懂![http://www. cnblogs.com/_franky/articles/2034514.html ](http://www. cnblogs.com/_franky/articles/2034514.html) 这里有个翻译,可是还是不懂。回头看看编译原理?

2013.06.26

参考资料:

http://www.zhangxinxu.com/wordpress/2013/06/css3-animation-%e7%82%b9%e7%82%b9%e7%82%b9%e7%ad%89%e5%be%85%e6%8f%90%e7%a4%ba%e6%95%88%e6%9e%9c/

http://www.zhangxinxu.com/wordpress/?p=1268

参考资料:

http://www.cnblogs.com/winter-cn/archive/2012/04/17/2454229.html

自动加分号规则,有3条

当有换行符(包括含有换行符的多行注释),并且下一个token没法跟前面的语法匹配时,会自动补分号。

当有}时,如果缺少分号,会补分号

当程序源代码结束时,如果缺少分号,会补分号。

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

对象是一系列属性的无序集合。每个属性可以是以下三者之一:命名数据属性、命名访问器属性、内部属性。

数据属性:包括属性名、value和一系列布尔值

访问器属性:包括属性名、一或两个访问器函数和一系列布尔值。

内部属性:没有名字,且不能直接通过 ECMAScript 语言操作。内部属性的存在纯粹为了规范的目的。

2013.06.27

Property Descriptor、 Property Identifier(未细看)

2013.06.28

2013.06.29

有三种可执行代码:

1.全局代码:这种类型的代码是在"程序"级处理的:例如加载外部的js文件或者本地的在标签内的代码。全局代码不包括任何函数体内的代码。

  1. eval代码:内置函数eval()的会执行其中的代码,即作为全局代码处理。如eval('var x =10');

  2. 函数代码:Function,不包括嵌套的函数。

词法环境 Lexical Environments(以下简称为L-E)

L-E是一个特定类,它用来定义将标识符关联到具体的变量和函数,基于ECMA代码的词法嵌套结构。(擦,虽然翻译出来了可完全不知道它在讲什么)一个 L-E 由一个Environment Record和一个可以为空的reference outer L-E 组成。通常,一个 L-E 包括若干个具体的ECMAScript语法结构(例如FunctionDeclaration函数声明,width的子句try的子句catch等),且每当类似代码执行时都会创建一个新的Lexcial Environment(你懂了么?反正我是没懂T_T)

一个Environment Record记录在与它相关的 L-E 中创建的标识符绑定。

外部环境指向是用来模拟 L-E 的逻辑嵌套。对一个(inner) L-E 的外部指向,是这个(inner) L-E 的逻辑环境的指向。一个外部L-E当然也可能有它自己的外部L-E。一个L-E可以作为多个内部L-E的外部环境。比如:一个函数声明,包含了两个嵌套函数声明,于是每个内部函数的L-Es都有它们的外部L-E:当前执行函数的环境。

L-Es和环境记录的值纯粹为了规范,无法被访问。

环境记录的值有两种:声明式和对象式。前者:常见的基本都是这个类型,例如函数定义,var声明,try的catch子句。后者:程序级别的和with标识符绑定。

可以理解成一个简单面向对象层级的抽象类的两个具体实现:声明式和对象式。以下是一个环境记录的抽象方法表。

执行环境(即执行上下文)很重要

执行控制流进入ECMAScript可执行代码(Executable code)时,控制流就进入了一个执行上下文(Execution context),活动的执行环境组成一个逻辑上的栈结构,且当前正在执行代码的执行环境总是在栈顶。一个执行环境是由:LexicalEnvironment、VariableEvironment和ThisBinding组成的。活动的执行上下文在逻辑上组成一个堆栈。堆栈底部永远都是全局上下文(global context),堆栈顶部是当前(活动的)执行上下文。堆栈在EC类型的变量(various kingds of EC)被推入或弹出的同时被修改。

当调用一个 JavaScript 函数时,该函数就会进入与该函数相对应的执行环境。如果又调用了另外一个函数(或者递归地调用同一个函数),则又会创建一个新的执行环境,并且在函数调用期间执行过程都处于该环境中。当调用的函数返回后,执行过程会返回原始执行环境。因而,运行中的 JavaScript 代码就构成了一个执行环境栈。每次返回存在的当前执行上下文和ECStack弹出相应的执行上下文的时候,栈指针会自动移动位置,这是一个典型的堆栈实现方式。每次执行到"return"语句,都会离开当前的执行上下文.代码抛出的异常如果没有被抓住,也可能离开一个或多个执行上下文.....当相关段代码执行完以后,直到整个应用程序结束,ECStack都只包括全局上下文(global context)。

ECMA 不存在块作用域,以函数体划分。只有使用“var”关键字定义在函数内部的变量才是函数作用域变量。

当ECMAScript开始执行时,创建一个全局执行环境和全局变量对象;后面每次进入一个函数时(这个函数被调用),则创建一个当前函数的执行环境并压 入栈,同时创建此执行环境的变量对象和作用域链,作用域链的创建规则是复制上一层环境的作用域链,并将指向本环境变量对象的指针放到链首;离开函数时,从 栈中弹出此执行环境并销毁,同时销毁环境的变量对象和作用域链。

作用域链的创建规则是复制上一层环境的作用域链,并将指向本环境变量对象的指针放到链首;

在每个执行环境都有并且只有一个与之关联的词法环境LexicalEnvironment, LexicalEnvironment 是一个 LexicalEnvironments (注意这是个复数)队形。 在代码执行过程中,如果需要解析变量,从词法环境对象中进行解析,需要取值,则从词法环境的环境数据(Environment Record)中读取,所以

下面对第十章做个总结:

一、可执行代码:即全局代码、eval代码和函数代码。

二、词法环境:词法环境是一个特定类型,由环境记录和外部环境指针组成。词法环境是一个链表式的嵌套结构。具体在执行上下文中讲到。

三、执行上下文:

1、什么是执行上下文?执行上下文以叫执行环境,是阐述ECMAScript如何执行代码的一套体系,一个机制。它在可以逻辑表示为一个Stack。

2、执行上下文的产生和运作:当进入可执行代码时,即产生了执行上下文。下面举例说明:

源代码:

img1

当进入<script>时,即产生了执行上下文,我们可以用ECStack来代表它。ECStack建立后,首先进入的是全局代码,push一个全局环境 global Context,同时建立这个全局环境的LexicalEnvironment、和ThisBinding。(全局环境没有VariableEnvironment)。LexicalEnvironment用来存放这个环境里的变量、语句的预解析 。ThisBinding(暂无研究)。abc的值以及funA的预解析就记录在这个L-E的环境记录里。因为全局环境是最外层的,所以它没有外部环境指针。

表达式

  1. 基本表达式:this/标识符/字面量/数组初始化/对象初始化/分组表达式
  2. 左值表达式:属性访问/new运算符/函数调用/参数列表/
  3. 后缀表达式: ++ --
  4. 一元运算符:delete/void/typeof/前自增/前自减/ …………

相关文章推荐: