Skip to content

Latest commit

 

History

History
121 lines (90 loc) · 13.2 KB

Function-Definition.md

File metadata and controls

121 lines (90 loc) · 13.2 KB

语法

 FunctionDeclaration :    function Identifier ( opt ) {  }**

 FunctionExpression :    function Identifieropt ( opt ) {  }**

 FormalParameterList :    Identifier     ,** Identifier

 FunctionBody :    SourceElementsopt

语义

产生式 : function Identifier ( opt ) { } 依照定义绑定初始化 (10.5) 如下初始化:

  1. 依照 13.2,指定 opt参数列表,指定 为 函数体,创建一个新函数对象,返回结果。运行中的执行环境的 VariableEnvironment 传递为 Scope。如果 包含在严格模式代码里或严格模式代码,那么传递 trueStrict 标志。

产生式 : function ( opt ) { } 的解释执行如下:

  1. 依照 13.2,指定 opt参数列表,指定 为 函数体,创建一个新函数对象,返回结果。运行中的执行环境的 LexicalEnvironment 传递为 Scope。如果 包含在严格模式代码里或严格模式代码,那么传递 trueStrict 标志。

产生式 : function Identifier ( opt ) { } 的解释执行如下:

  1. funcEnv 为以运行中执行环境的 LexicalEnvironment 为参数调用 NewDeclarativeEnvironment 的结果。
  2. envRecfuncEnv 的环境记录项。
  3. Identifier 的字符串值为参数调用 envRec 的具体方法 CreateImmutableBinding(N)。
  4. closure 为依照 13.2,指定 opt 为参数,指定 为 函数体,创建一个新函数对象的结果。传递 funcEnvScope。如果 包含在严格模式代码里或严格模式代码,那么传递 trueStrict 标志。
  5. Identifier 的字符串值和 closure 为参数调用 envRec 的具体方法 InitializeImmutableBinding(N,V)。
  6. 返回 closure

产生式 : SourceElementsopt 的解释执行如下:

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

严格的模式的限制

如果严格模式 或 的 里出现多个相同 Identifier 值,那么这是个 SyntaxError

如果严格模式 或 的 里出现标识符 "eval" 或标识符 "arguments",那么这是个 SyntaxError

如果严格模式 或 的 Identifier 是标识符 "eval" 或标识符 "arguments",那么这是个 SyntaxError

创建函数对象

指定 为可选的 参数列表,指定 为 函数体,指定 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 为一个列表容器,其中元素是以从左到右的文本顺序对应 的标识符的字符串。

  11. 设定 F[[FormalParameters]] 内部属性为 names

  12. 设定 F[[Code]] 内部属性为 。

  13. 设定 F[[Extensible]] 内部属性为 true

  14. len 为 指定的形式参数的个数。如果没有指定参数,则令 len0

  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. 如果 Stricttrue,则

    1. thrower[[ThrowTypeError]] 函数对象(13.2.3)。
    2. 以参数 "caller"、属性描述符 {[[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}、false 调用 F[[DefineOwnProperty]] 内部方法。
    3. 以参数 "arguments"、属性描述符 {[[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}、false 调用 F[[DefineOwnProperty]] 内部方法。
  20. 返回 F

[[Call]]

当用一个 this 值、一个参数列表调用函数对象 F[[Call]] 内部方法,采用以下步骤:

  1. F[[FormalParameters]] 内部属性值、参数列表 args10.4.3 描述的 this 值来建立函数代码的一个新执行环境,令 funcCtx 为其结果。
  2. result 为 (也就是 F[[Code]] 内部属性)解释执行的结果。如果 F 没有 [[Code]] 内部属性或其值是空的 ,则 result 是 (normal, undefined, empty)。
  3. 退出 funcCtx 运行环境,恢复到之前的执行运行环境。
  4. 如果 result.typethrow 则抛出 result.value
  5. 如果 result.typereturn 则返回 result.value
  6. 否则 result.type 必定是 normal。返回 undefined

[[Construct]]

当以一个可能的空的参数列表调用函数对象 F[[Construct]] 内部方法,采用以下步骤:

  1. obj 为新创建的 ECMAScript 原生对象。
  2. 依照 8.12 设定 obj 的所有内部方法。
  3. 设定 obj[[Class]] 内部属性为 "Object"
  4. 设定 obj[[Extensible]] 内部属性为 true
  5. proto 为以参数 "prototype" 调用 F[[Get]] 内部属性的值。
  6. 如果 Type(proto) 是 Object,设定 obj[[Prototype]] 内部属性为 proto
  7. 如果 Type(proto) 不是 Object,设定 obj[[Prototype]] 内部属性为 15.2.4 描述的标准内置的 Object 原型对象。
  8. objthis 值,调用 [[Construct]] 的参数列表为 args,调用 F[[Call]] 内部属性,令 result 为调用结果。
  9. 如果 Type(result) 是 Object,则返回 result
  10. 返回 obj

[[ThrowTypeError]] 函数对象

[[ThrowTypeError]] 对象是个唯一的函数对象,如下只定义一次:

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