指定 FormalParameterList 為可選參數(shù)列表,指定 FunctionBody 為函數(shù)體,指定 Scope 為 詞法環(huán)境 ,Strict 為布爾標記,按照如下步驟構建函數(shù)對象:
- 創(chuàng)建一個新的 ECMAScript 原生對象,令 F 為此對象。
- 依照 8.12 描述設定 F 的除 [[Get]] 以外的所有內部方法。
- 設定 F 的 [[Class]] 內部屬性為 "Function"。
- 設定 F 的 [[Prototype]] 內部屬性為 15.3.3.1 指定的標準內置 Function 對象的 prototype 屬性。
- 依照 15.3.5.4 描述,設定 F 的 [[Get]] 內部屬性。
- 依照 13.2.1 描述,設定 F 的 [[Call]] 內部屬性。
- 依照 13.2.2 描述,設定 F 的 [[Construct]] 內部屬性。
- 依照 15.3.5.3 描述,設定 F 的 [[HasInstance]] 內部屬性。
- 設定 F 的 [[Scope]] 內部屬性為 Scope 的值。
- 令 names 為一個列表容器,其中元素是以從左到右的文本順序對應 FormalParameterList 的標識符的字符串。
- 設定 F 的 [[FormalParameters]] 內部屬性為 names。
- 設定 F 的 [[Code]] 內部屬性為 FunctionBody。
- 設定 F 的 [[Extensible]] 內部屬性為 true。
- 令 len 為 FormalParameterList 指定的形式參數(shù)的個數(shù)。如果沒有指定參數(shù),則令 len 為 0。
- 以參數(shù) "length",屬性描述符 {[[Value]]: len, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false},false 調用 F 的 [[DefineOwnProperty]] 內部方法。
- 令 proto 為仿佛使用 new Object() 表達式創(chuàng)建新對象的結果,其中 Object 是標準內置構造器名。
- 以參數(shù) "constructor", 屬性描述符 {[[Value]]: F, { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}, false 調用 proto 的 [[DefineOwnProperty]] 內部方法。
- 以參數(shù) "prototype", 屬性描述符 {[[Value]]: proto, { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false}, false 調用 F 的 [[DefineOwnProperty]] 內部方法。
- 如果 Strict 是 true,則令 thrower 為 [[ThrowTypeError]] 函數(shù)對象 (13.2.3)。以參數(shù) "caller", 屬性描述符 {[[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}, false 調用 F 的 [[DefineOwnProperty]] 內部方法。以參數(shù) "caller", 屬性描述符 {[[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}, false 調用 F 的 [[DefineOwnProperty]] 內部方法。
- 返回 F。
每個函數(shù)都會自動創(chuàng)建一個 prototype 屬性,以滿足函數(shù)會被當作構造器的可能性。
[[call]]
當用一個 this 值,一個參數(shù)列表調用函數(shù)對象 F 的 [[Call]] 內部方法,采用以下步驟:
- 用 F 的 [[FormalParameters]] 內部屬性值,參數(shù)列表 args,10.4.3 描述的 this 值來建立 函數(shù)代碼 的一個新執(zhí)行環(huán)境,令 funcCtx 為其結果。
- 令 result 為 FunctionBody(也就是 F 的 [[Code]] 內部屬性)解釋執(zhí)行的結果。如果 F 沒有 [[Code]] 內部屬性或其值是空的 FunctionBody,則 result 是 (normal, undefined, empty)。
- 退出 funcCtx 執(zhí)行環(huán)境,恢復到之前的執(zhí)行環(huán)境。
- 如果 result.type 是 throw 則拋出 result.value。
- 如果 result.type 是 return 則返回 result.value。
- 否則 result.type 必定是 normal。返回 undefined。
[[Construct]]
當以一個可能的空的參數(shù)列表調用函數(shù)對象 F 的 [[Construct]] 內部方法,采用以下步驟:
- 令 obj 為新創(chuàng)建的 ECMAScript 原生對象。
- 依照 8.12 設定 obj 的所有內部方法。
- 設定 obj 的 [[Class]] 內部方法為 "Object"。
- 設定 obj 的 [[Extensible]] 內部方法為 true。
- 令 proto 為以參數(shù) "prototype" 調用 F 的 [[Get]] 內部屬性的值。
- 如果 Type(proto) 是 Object,設定 obj 的 [[Prototype]] 內部屬性為 proto。
- 如果 Type(proto) 不是 Object,設定 obj 的 [[Prototype]] 內部屬性為 15.2.4 描述的標準內置的 Object 的 prototype 對象。
- 以 obj 為 this 值,調用 [[Construct]] 的參數(shù)列表為 args,調用 F 的 [[Call]] 內部屬性,令 result 為調用結果。
- 如果 Type(result) 是 Object,則返回 result。
- 返回 obj
[[ThrowTypeError]] 函數(shù)對象
[[ThrowTypeError]] 對象是個唯一的函數(shù)對象,如下只定義一次:
- 創(chuàng)建一個新 ECMAScript 原生對象,令 F 為此對象。
- 依照 8.12 設定 F 的所有內部屬性。
- 設定 F 的 [[Class]] 內部屬性為 "Function"。
- 設定 F 的 [[Prototype]] 內部屬性為 15.3.3.1 指定的標準內置 Function 的 prototype 對象。
- 依照 13.2.1 描述設定 F 的 [[Call]] 內部屬性。
- 設定 F 的 [[Scope]] 內部屬性為 全局環(huán)境 。
- 設定 F 的 [[FormalParameters]] 內部屬性為一個空 列表 。
- 設定 F 的 [[Code]] 內部屬性為一個 FunctionBody,它無條件拋出一個 TypeError 異常,不做其他事情。
- 以參數(shù) "length", 屬性描述符 {[[Value]]: 0, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}, false 調用 F 的 [[DefineOwnProperty]] 內部方法。
- 設定 F 的 [[Extensible]] 內部屬性為 false。
- 令 [[ThrowTypeError]] 為 F。
更多建議: