ECMAScript5学习笔记--第十三章 函数定义

语法:

  FunctionDeclaration :

  function Identifier ( FormalParameterListopt ) { FunctionBody }

  FunctionExpression :

  function Identifieropt ( FormalParameterListopt ) { FunctionBody }

  FormalParameterList :

  Identifier

  FormalParameterList , Identifier

  FunctionBody :

  SourceElementsopt

  •   产生式 FunctionDeclaration : function Identifier ( FormalParameterListopt ) { FunctionBody } 依照定义绑定初始化 (10.5) 如下初始化:
  1. 依照 13.2,指定 FormalParameterListopt 为参数,指定 FunctionBody 为 body,创建一个新函数对象,返回结果。运行中的执行环境的 VariableEnvironment 传递为 Scope。如果 FunctionDeclaration 包含在 严格模式代码 里或 FunctionBody 是 严格模式代码 ,那么传递 true 为 Strict 标志。
  •   产生式 FunctionExpression : function ( FormalParameterListopt ) { FunctionBody } 的解释执行如下:
  1. 依照 13.2,指定 FormalParameterListopt 为参数,指定 FunctionBody 为 body,创建一个新函数对象,返回结果。运行中的执行环境的 LexicalEnvironment 传递为 Scope。如果 FunctionExpression 包含在 严格模式代码 里或 FunctionBody 是 严格模式代码 ,那么传递 true 为 Strict 标志。

  

  •   产生式 FunctionExpression : function Identifieropt ( FormalParameterListopt ) { FunctionBody } 的解释执行如下:
  1. 令 funcEnv 为以运行中执行环境的 Lexical Environment 为参数调用 NewDeclarativeEnvironment 的结果。
  2. 令 envRec 为 funcEnv 的环境记录项。
  3. 以 Identifier 的字符串值为参数调用 envRec 的具体方法 CreateImmutableBinding(N)。
  4. 令 closure 为依照 13.2,指定 FormalParameterListopt 为参数,指定 FunctionBody 为 body,创建一个新函数对象的结果。传递 funcEnv 为 Scope。如果 FunctionExpression 包含在严格模式代码 里或 FunctionBody 是 严格模式代码 ,那么传递 true 为 Strict 标志。
  5. 以 Identifier 的字符串值和 closure 为参数调用 envRec 的具体方法 InitializeImmutableBinding(N,V)。
  6. 返回 closure。

   可以从 FunctionExpression 的 FunctionBody 里面引用 FunctionExpression 的 Identifier,以允许函数递归调用自身。然而不像 FunctionDeclaration,FunctionExpression 的 Identifier 不能被范围封闭的 FunctionExpression 引用,也不会影响它。

  •   产生式 FunctionBody : SourceElementsopt 的解释执行如下:
  1. 如果这个 FunctionBody 所在 FunctionDeclaration 或 FunctionExpression 包含在严格模式代码内,或其 SourceElements 的指令序言 (14.1) 包含一个 use strict 指令,或满足 10.1 的任何条件,那么其代码是严格模式代码。如果 FunctionBody 的代码是严格模式代码,SourceElements 的解释执行为以下的严格模式代码步骤。否则,SourceElements 的解释执行为以下的非严格模式步骤。
  2. 如果 SourceElements 是当前的,则返回 SourceElements 的解释执行结果。
  3. 否则返回 (normal, undefined, empty)。

13.1  严格模式的限制:

  严格模式的functionDeclaration或者functionExpression的formalParameterList里面出现相同的identifier或者标识符"eval"或者标识符"arguments";或者identifier是标识符"eval"或"arguments"会导致语法错误

13.2  创建函数对象:  

  指定 FormalParameterList 为可选参数列表,指定 FunctionBody 为函数体,指定 Scope 为 词法环境 ,Strict 为布尔标记,按照如下步骤构建函数对象:

  1. 创建一个新的 ECMAScript 原生对象,令 F 为此对象。
  2. 依照 8.12 描述设定 F 的除 [[Get]] 以外的所有内部方法。
  3. 设定 F 的 [[Class]] 内部属性为 "Function"。
  4. 设定 F 的 [[Prototype]] 内部属性为 15.3.3.1 指定的标准内置 Function 对象的 prototype 属性。
  5. 依照 15.3.5.4 描述,设定 F 的 [[Get]] 内部属性。
  6. 依照 13.2.1 描述,设定 F 的 [[Call]] 内部属性。
  7. 依照 13.2.2 描述,设定 F 的 [[Construct]] 内部属性。
  8. 依照 15.3.5.3 描述,设定 F 的 [[HasInstance]] 内部属性。
  9. 设定 F 的 [[Scope]] 内部属性为 Scope 的值。
  10. 令 names 为一个列表容器,其中元素是以从左到右的文本顺序对应 FormalParameterList 的标识符的字符串。
  11. 设定 F 的 [[FormalParameters]] 内部属性为 names。
  12. 设定 F 的 [[Code]] 内部属性为 FunctionBody。
  13. 设定 F 的 [[Extensible]] 内部属性为 true。
  14. 令 len 为 FormalParameterList 指定的形式参数的个数。如果没有指定参数,则令 len 为 0。
  15. 以参数 "length",属性描述符 {[[Value]]: len, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false},false 调用 F 的 [[DefineOwnProperty]] 内部方法。
  16. 令 proto 为仿佛使用 new Object() 表达式创建新对象的结果,其中 Object 是标准内置构造器名。
  17. 以参数 "constructor", 属性描述符 {[[Value]]: F, { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}, false 调用 proto 的 [[DefineOwnProperty]] 内部方法。
  18. 以参数 "prototype", 属性描述符 {[[Value]]: proto, { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false}, false 调用 F 的 [[DefineOwnProperty]] 内部方法。
  19. 如果 Strict 是 true,则
    1. 令 thrower 为 [[ThrowTypeError]] 函数对象 (13.2.3)。
    2. 调用F 的[[DefineOwnProperty]]内部方法with参数 "caller", 属性描述符 {[[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}, false 调用 F 的 [[DefineOwnProperty]] 内部方法。
    3. 调用F 的[[DefineOwnProperty]]内部方法with参数 "arguments", 属性描述符 {[[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}, false 调用 F 的 [[DefineOwnProperty]] 内部方法。
  20. 返回 F。

  

13.2.1  [[call]]

  •   当用一个 this 值,一个参数列表调用函数对象 F 的 [[Call]] 内部方法,采用以下步骤:
  1. 用 F 的 [[FormalParameters]] 内部属性值,参数列表 args,10.4.3 描述的 this 值来建立 函数代码 的一个新执行环境,令 funcCtx 为其结果。
  2. 令 result 为 FunctionBody(也就是 F 的 [[Code]] 内部属性)解释执行的结果。如果 F 没有 [[Code]] 内部属性或其值是空的 FunctionBody,则 result 是 (normal, undefined, empty)。
  3. 退出 funcCtx 执行环境,恢复到之前的执行环境。
  4. 如果 result.type 是 throw 则抛出 result.value。
  5. 如果 result.type 是 return 则返回 result.value。
  6. 否则 result.type 必定是 normal。返回 undefined。

13.2.2  [[Construct]]

  •   当一个函数对象F的[[Construct]]内在方法被可能为空列表的参数调用时,
  1. 使obj成为一个新创建的原生的ECMAScript对象
  2. 设置obj所有的内部方法(在8.12中定义)
  3. 设置obj的[[Class]]内部property为object
  4. 设置obj的[[Extensible]]内部property为true
  5. 令 proto 为以参数 "prototype" 调用 F 的 [[Get]] 内部属性的值。
  6. 如果 Type(proto) 是 Object,设定 obj 的 [[Prototype]] 内部属性为 proto。
  7. 如果 Type(proto) 不是 Object,设定 obj 的 [[Prototype]] 内部属性为 15.2.4 描述的标准内置的 Object 的 prototype 对象。
  8. 以 obj 为 this 值,调用 [[Construct]] 的参数列表为 args,调用 F 的 [[Call]] 内部属性,令 result 为调用结果。
  9. 如果 Type(result) 是 Object,则返回 result。
  10. 返回 obj

13.2.3  [[ThrowtypeError]]函数对象  

  •   [[ThrowTypeError]] 对象是个唯一的函数对象,如下只定义一次:
  1. 创建一个新 ECMAScript 原生对象,令 F 为此对象。
  2. 依照 8.12 设定 F 的所有内部属性。
  3. 设定 F 的 [[Class]] 内部属性为 "Function"。
  4. 设定 F 的 [[Prototype]] 内部属性为 15.3.3.1 指定的标准内置 Function 的 prototype 对象。
  5. 依照 13.2.1 描述设定 F 的 [[Call]] 内部属性。
  6. 设定 F 的 [[Scope]] 内部属性为 全局环境 。
  7. 设定 F 的 [[FormalParameters]] 内部属性为一个空 列表 。
  8. 设定 F 的 [[Code]] 内部属性为一个 FunctionBody,它无条件抛出一个 TypeError 异常,不做其他事情。
  9. 以参数 "length", 属性描述符 {[[Value]]: 0, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}, false 调用 F 的 [[DefineOwnProperty]] 内部方法。
  10. 设定 F 的 [[Extensible]] 内部属性为 false。
  11. 令 [[ThrowTypeError]] 为 F。
时间: 2024-10-12 21:35:03

ECMAScript5学习笔记--第十三章 函数定义的相关文章

Java学习笔记—第十三章 数据库编程入门

第十三章 数据库编程入门 了解JDBC Java中对数据库的访问主要是通过JDBC进行的.JDBC是Java数据库连接技术(Java Database Connectivity)的简称,是用于执行SQL语句的API,可以为多种关系数据库提供统一访问.由一组用Java语言编写的类和接口组成.(SQL是Structure Query Language的缩写,意义为结构化查询语言,是一种标准的关系数据库访问语言.) JDBC的工作机制 使用JDBC完成对数据库的访问主要包括以下五个层次:Java应用程

ECMAScript5学习笔记-第10章

10 可执行代码与可执行环境 10.1 可执行代码类型:全局代码(作为ECMA脚本被解析的源代码),eval(在特定的一次对eval的调用过程中,eval代码作为改程序的#global-code部分),函数代码(作为函数体被解析的源代码,不包括嵌套函数的函数体被解析的源代码) 10.1.1  严格模式下的代码 以指令序言开始,包含一个使用严格模式的指令序言 在严格模式下的代码中通过直接调用eval函数时即为严格eval代码 函数声明,函数表达式或函数赋值访问器处在严格模式下的代码中,或者函数代码

ECMAScript5学习笔记-第11章

11.表达式 11.1  主值表达式  语法:PrimaryExpression : this:执行为当前执行环境的ThisBinding Identifier :执行遵循 标识符解析 的标识符查找.标识符执行的结果总是一个 Reference 类型的值.  Literal:  ArrayLiteral:一个零个或者多个表达式的序列,其中每一个表示一个数组元素,并且用方括号括起来 当元素列表中的一个逗号没有被 AssignmentExpression 优先处理(如,一个逗号在另一个逗号之前.)的

Solr in action学习笔记 第十三章 SolrCloud

13.1 Getting started with SolrCloud 13.1.1Starting Solr in cloud mode 单机建立一个集群应用,一个端口模拟一个solr cd $SOLR_INSTALL/cp -r example/ shard1/ 13.1.2 Motivation behind the SolrCloud architecture ■ Scalability■ High availability■ Consistency■ Simplicity■ Elast

The C++ Programming Language 学习笔记 第7章 函数

1.关于内联函数(inline)      借用一下书中的例子. 1 inline int fac(int n) 2 { 3 return (n<2) ? 1:n*fac(n-1); 4 }      inline描述符给编译器一个提示,要求它试着把所有对fac()的调用在线化,也就是假如一个编译器够聪明的话,它会把对fac(6)生成常数720,然后直接代替代码中fac(6)的位置.不过这要视函数的复杂程度而言,假如递归复杂,或是有大量循环,或者代码复杂,或者并不依赖输入的内联函数(这个不知道为

《JAVA编程思想》学习笔记——第十三章 字符串

String对象是不可变的.查看JDk文档你就会发现,String类每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包含修改后的字符串内容.而最初的String对象则丝毫未动. +和StringBuilder StringBuilder比+更高效 String常用操作 正则表达式 略

【算法导论】学习笔记——第6章 堆排序

堆这个数据结构应用非常广泛,数字图像处理的算法里也见过.似乎记得以前老师上课说需要用树结构实现堆排序,看了一下算法导论才明白其精髓.堆虽然是一棵树,但显然没必要非得用树结构实现堆排序.堆排序的性质很好,算法时间复杂度为O(nlgn). 1. 堆排序的简要说明.二叉堆可以分为两种形式:最大堆和最小堆.在最大堆中,最大堆性质是指除了根以外的所有结点i都要满足: A[PARENT(i)] >= A[i]:在最小堆中,最小堆性质是指除了根以外的所有结点i都要满足: A[PARENT(i)] <= A[

Java编程思想第四版读书笔记——第十三章 字符串

Java编程思想第四版读书笔记--第十三章 字符串 字符串的操作是计算机程序设计中最常见的行为. 关键词: StringBuilder ,StringBuffer,toString(),format转换,正则表达式, 1.不可变String String对象时不可变的.每当把String对象作为方法的参数时,都会复制一份引用.(其实就是对函数中参数列表中参数的操作不会影响外面的原参数) 如下: import static net.mindview.util.Print.*; public cla

APUE学习笔记:第一章 UNUX基础知识

1.2 UNIX体系结构 从严格意义上,可将操作系统定义为一种软件(内核),它控制计算机硬件资源,提供程序运行环境.内核的接口被称为系统调用.公用函数库构建在系统调用接口之上,应用软件即可使用公用函数库,也可使用系统调用.shell是一种特殊的应用程序,它为运行其他应用程序提供了一个接口 从广义上,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并给予计算机以独有的特性(软件包括系统实用程序,应用软件,shell以及公用函数库等) 1.3  shell shell是一个命令行解