99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

Function 對象

2018-06-16 15:27 更新

作為函數調用 Function 構造器

 當將 Function 作為函數來調用,而不是作為構造器,它會創(chuàng)建并初始化一個新函數對象。所以函數調用 Function(…) 與用相同參數的 new Function(…) 表達式創(chuàng)建的對象相同。

Function (p1, p2, … , pn, body)

 當以 p1, p2, … , pn, body 作為參數調用 Function 函數(這里的 n 可以是 0,也就是說沒有“p”參數,這時還可以不提供 body),采用如下步驟:

  1. 創(chuàng)建并返回一個新函數對象,它仿佛是用相同參數給標準內置構造器 Function (15.3.2.1). 用一個 new 表達式創(chuàng)建的。

Function 構造器

 當 Function 作為 new 表達式的一部分被調用時,它是一個構造器:它初始化新創(chuàng)建的對象。

new Function (p1, p2, … , pn, body)

 最后一個參數指定為函數的 body( 可執(zhí)行代碼 );之前的任何參數都指定為形式參數。

 當以 p1, p2, … , pn, body 作為參數調用 Function 構造器(這里的 n 可以是 0,也就是說沒有“p”參數,這時還可以不提供 body),采用如下步驟:

  1. 令 argCount 為傳給這個函數調用的參數總數 .
  2. 令 P 為空字符串 .
  3. 如果 argCount = 0, 令 body 為空字符串 .
  4. 否則如果 argCount = 1, 令 body 為那個參數 .
  5. 否則 , argCount > 1令 firstArg 為第一個參數 .令 P 為 ToString(firstArg).令 k 為 2.只要 k < argCount 就重復令 nextArg 為第 k 個參數 .令 P 為之前的 P 值,字符串 ","(一個逗號),ToString(nextArg) 串聯的結果。k 遞增 1.令 body 為第 k 個參數 .
  6. 令 body 為 ToString(body).
  7. 如果 P 不可解析為一個 FormalParameterListopt,則拋出一個 SyntaxError 異常 .
  8. 如果 body 不可解析為 FunctionBody,則拋出一個 SyntaxError 異常 .
  9. 如果 body 是嚴格模式代碼 ( 見 10.1.1),則令 strict 為 true, 否則令 strict 為 false.
  10. 如果 strict 是 true, 適用 13.1 指定拋出的任何異常 .
  11. 返回一個新創(chuàng)建的函數對象,它是依照 13.2 指定 -- 專遞 P 作為 FormalParameterList,body 作為 FunctionBody,全局環(huán)境作為 Scope 參數,strict 作為嚴格模式標志 -- 創(chuàng)建的。

 每個函數都會自動創(chuàng)建一個 prototype 屬性,用來支持函數被當做構造器使用的可能性。

為每個形參指定一個參數是允許的,但沒必要。例如以下三個表達式產生相同的結果:

new Function("a", "b", "c", "return a+b+c") new Function("a, b, c", "return a+b+c") new Function("a,b", "c", "return a+b+c")

Function 構造器的屬性

 Function 構造器自身是個函數對象,它的 [[Class]] 是 "Function"。Function 構造器的 [[Prototype]] 內部屬性值是標準內置 Function 的 prototype 對象 (15.3.4)。

 Function 構造器的 [[Extensible]] 內部屬性值是 true.

 Function 構造器有如下屬性 :

Function.prototype

 Function.prototype 的初始值是標準內置 Function 的 prototype 對象 (15.3.4)。

 此屬性擁有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

Function.length

 這是個值為 1 的數據屬性。此屬性擁有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

Function 的 prototype 對象的屬性

 Function 的 prototype 對象自身是一個函數對象 ( 它的 [[Class]] 是 "Function"),調用這個函數對象時,接受任何參數并返回 undefined。

 Function 的 prototype 對象的 [[Prototype]] 內部屬性值是標準內置 Object 的 prototype 對象 (15.2.4)。Function 的 prototype 對象的 [[Extensible]] 內部屬性的初始值是 true。

 Function 的 prototype 對象自身沒有 valueOf 屬性 ; 但是,它從 Object 的 prototype 對象繼承了 valueOf 屬性。

 Function 的 prototype 對象的 length 屬性是 0。

Function.prototype.constructor

 Function.prototype.constructor 的初始值是內置 Function 構造器。

Function.prototype.toString ( )

 此函數的返回值的表示是依賴于實現的。這個表示包含 FunctionDeclaration 的語法。特別注意,怎樣在這個字符串表示中使用和放置空白,行終結符,分號是依賴于實現的。

 這個 toString 不是通用的;如果它的 this 值不是一個函數對象,它會拋出一個 TypeError 異常。因此,它不能當做方法來轉移到其他類型的對象中。

Function.prototype.apply (thisArg, argArray)

 當以 thisArg 和 argArray 為參數在一個 func 對象上調用 apply 方法,采用如下步驟:

  1. 如果 IsCallable(func) 是 false, 則拋出一個 TypeError 異常 .
  2. 如果 argArray 是 null 或 undefined, 則返回提供 thisArg 作為 this 值并以空參數列表調用 func 的 [[Call]] 內部方法的結果。
  3. 如果 Type(argArray) 不是 Object, 則拋出一個 TypeError 異常 .
  4. 令 len 為以 "length" 作為參數調用 argArray 的 [[Get]] 內部方法的結果。
  5. 令 n 為 ToUint32(len).
  6. 令 argList 為一個空列表 .
  7. 令 index 為 0.
  8. 只要 index < n 就重復令 indexName 為 ToString(index).令 nextArg 為以 indexName 作為參數調用 argArray 的 [[Get]] 內部方法的結果。將 nextArg 作為最后一個元素插入到 argList 里。設定 index 為 index + 1.
  9. 提供 thisArg 作為 this 值并以 argList 作為參數列表,調用 func 的 [[Call]] 內部方法,返回結果。

 apply 方法的 length 屬性是 2。

 在外面?zhèn)魅氲?thisArg 值會修改并成為 this 值。thisArg 是 undefined 或 null 時它會被替換成全局對象,所有其他值會被應用 ToObject 并將結果作為 this 值,這是第三版引入的更改。

Function.prototype.call (thisArg [ , arg1 [ , arg2, … ] ] )

 當以 thisArg 和可選的 arg1, arg2 等等作為參數在一個 func 對象上調用 call 方法,采用如下步驟:

  1. 如果 IsCallable(func) 是 false, 則拋出一個 TypeError 異常。
  2. 令 argList 為一個空列表。
  3. 如果調用這個方法的參數多余一個,則從 arg1 開始以從左到右的順序將每個參數插入為 argList 的最后一個元素。
  4. 提供 thisArg 作為 this 值并以 argList 作為參數列表,調用 func 的 [[Call]] 內部方法,返回結果。

 call 方法的 length 屬性是 1。

 在外面?zhèn)魅氲?thisArg 值會修改并成為 this 值。thisArg 是 undefined 或 null 時它會被替換成全局對象,所有其他值會被應用 ToObject 并將結果作為 this 值,這是第三版引入的更改。

Function.prototype.bind (thisArg [, arg1 [, arg2, …]])

 bind 方法需要一個或更多參數,thisArg 和(可選的)arg1, arg2, 等等,執(zhí)行如下步驟返回一個新函數對象:

  1. 令 Target 為 this 值 .
  2. 如果 IsCallable(Target) 是 false, 拋出一個 TypeError 異常 .
  3. 令 A 為一個(可能為空的)新內部列表,它包含按順序的 thisArg 后面的所有參數(arg1, arg2 等等)。
  4. 令 F 為一個新原生 ECMAScript 對象。
  5. 依照 8.12 指定,設定 F 的除了 [[Get]] 之外的所有內部方法。
  6. 依照 15.3.5.4 指定,設定 F 的 [[Get]] 內部屬性。
  7. 設定 F 的 [[TargetFunction]] 內部屬性為 Target。
  8. 設定 F 的 [[BoundThis]] 內部屬性為 thisArg 的值。
  9. 設定 F 的 [[BoundArgs]] 內部屬性為 A。
  10. 設定 F 的 [[Class]] 內部屬性為 "Function"。
  11. 設定 F 的 [[Prototype]] 內部屬性為 15.3.3.1 指定的標準內置 Function 的 prototype 對象。
  12. 依照 15.3.4.5.1 描述,設定 F 的 [[Call]] 內置屬性。
  13. 依照 15.3.4.5.2 描述,設定 F 的 [[Construct]] 內置屬性。
  14. 依照 15.3.4.5.3 描述,設定 F 的 [[HasInstance]] 內置屬性。
  15. 如果 Target 的 [[Class]] 內部屬性是 "Function", 則令 L 為 Target 的 length 屬性減 A 的長度。設定 F 的 length 自身屬性為 0 和 L 中更大的值。
  16. 否則設定 F 的 length 自身屬性為 0.
  17. 設定 F 的 length 自身屬性的特性為 15.3.5.1 指定的值。
  18. 設定 F 的 [[Extensible]] 內部屬性為 true。
  19. 令 thrower 為 [[ThrowTypeError]] 函數對象 (13.2.3)。
  20. 以 "caller", 屬性描述符 {[[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}, 和 false 作為參數調用 F 的 [[DefineOwnProperty]] 內部方法。
  21. 以 "arguments", 屬性描述符 {[[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}, 和 false 作為參數調用 F 的 [[DefineOwnProperty]] 內部方法。
  22. 返回 F.

 bind 方法的 length 屬性是 1。

 Function.prototype.bind 創(chuàng)建的函數對象不包含 prototype 屬性或 [[Code]], [[FormalParameters]], [[Scope]] 內部屬性。

[[Call]]

 當調用一個用 bind 函數創(chuàng)建的函數對象 F 的 [[Call]] 內部方法,傳入一個 this 值和一個參數列表 ExtraArgs,采用如下步驟:

  1. 令 boundArgs 為 F 的 [[BoundArgs]] 內部屬性值。
  2. 令 boundThis 為 F 的 [[BoundThis]] 內部屬性值。
  3. 令 target 為 F 的 [[TargetFunction]] 內部屬性值。
  4. 令 args 為一個新列表,它包含與列表 boundArgs 相同順序相同值,后面跟著與 ExtraArgs 是相同順序相同值。
  5. 提供 boundThis 作為 this 值,提供 args 為參數調用 target 的 [[Call]] 內部方法,返回結果。
[[Construct]]

 當調用一個用 bind 函數創(chuàng)建的函數對象 F 的 [[Construct]] 內部方法,傳入一個參數列表 ExtraArgs,采用如下步驟:

  1. 令 target 為 F 的 [[TargetFunction]] 內部屬性值。
  2. 如果 target 不包含 [[Construct]] 內部方法 , 拋出一個 TypeError 異常。
  3. 令 boundArgs 為 F 的 [[BoundArgs]] 內部屬性值。
  4. 令 args 為一個新列表,它包含與列表 boundArgs 相同順序相同值,后面跟著與 ExtraArgs 是相同順序相同值。
  5. 提供 args 為參數調用 target 的 [[Construct]] 內部方法,返回結果。
[[HasInstance]] (V)

 當調用一個用 bind 函數創(chuàng)建的函數對象 F 的 [[Construct]] 內部方法,并以 V 作為參數,采用如下步驟:

  1. 令 target 為 F 的 [[TargetFunction]] 內部屬性值。
  2. 如果 target 不包含 [[HasInstance]] 內部方法 , 拋出一個 TypeError 異常。
  3. 提供 V 為參數調用 target 的 [[HasInstance]] 內部方法,返回結果。

Function 的實例的屬性

 除了必要的內部屬性之外,每個函數實例還有一個 [[Call]] 內部屬性并且在大多數情況下使用不同版本的 [[Get]] 內部屬性。函數實例根據怎樣創(chuàng)建的(見 8.6.2 ,13.2, 15, 15.3.4.5)可能還有一個 [[HasInstance]] 內部屬性 , 一個 [[Scope]] 內部屬性 , 一個 [[Construct]] 內部屬性 , 一個 [[FormalParameters]] 內部屬性 , 一個 [[Code]] 內部屬性 , 一個 [[TargetFunction]] 內部屬性 , 一個 [[BoundThis]] 內部屬性 , 一個 [[BoundArgs]] 內部屬性。

 [[Class]] 內部屬性的值是 "Function"。

 對應于嚴格模式函數 (13.2) 的函數實例和用 Function.prototype.bind 方法 (15.3.4.5) 創(chuàng)建的函數實例有名為“caller”和 “arguments”的屬性時,拋出一個 TypeError 異常。一個 ECMAScript 實現不得為在嚴格模式函數代碼里訪問這些屬性關聯任何依賴實現的特定行為。

length

 length 屬性值是個整數,它指出函數預期的“一般的”參數個數。然而,語言允許用其他數量的參數來調用函數。當以與函數的 length 屬性指定的數量不同的參數個數調用函數時,它的行為依賴于函數自身。這個屬性擁有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

prototype

 prototype 屬性的值用于初始化一個新創(chuàng)建對象的的 [[Prototype]] 內部屬性,為了這個新創(chuàng)建對象要先將函數對象作為構造器調用。這個屬性擁有特性 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }。

 用 Function.prototype.bind 創(chuàng)建的函數對象沒有 prototype 屬性。

[[HasInstance]] (V)

 設 F 是個函數對象。

 當以 V 作為參數調用 F 的 [[HasInstance]] 內部方法,采用如下步驟:

  1. 如果 V 不是個對象 , 返回 false。
  2. 令 O 為用屬性名 "prototype" 調用 F 的 [[Get]] 內部方法的結果。
  3. 如果 Type(O) 不是 Object, 拋出一個 TypeError 異常。
  4. 重復令 V 為 V 的 [[Prototype]] 內部屬性值。如果 V 是 null, 返回 false.如果 O 和 V 指向相同對象,返回 true。

 用 Function.prototype.bind 創(chuàng)建的函數對象擁有的不同的 [[HasInstance]] 實現,在 15.3.4.5.3 中定義。

[[Get]] (P)

 函數對象與其他原生 EMACScript 對象 (8.12.3) 用不同的 [[Get]] 內部方法。

 設 F 是一個函數對象,當以屬性名 P 調用 F 的 [[Get]] 內部方法 , 采用如下步驟:

  1. 令 v 為傳入 P 作為屬性名參數調用 F 的默認 [[Get]] 內部方法 (8.12.3) 的結果。
  2. 如果 P 是 "caller" 并且 v 是個嚴格模式函數對象 , 拋出一個 TypeError 異常。
  3. 返回 v。

 用 Function.prototype.bind 創(chuàng)建的函數對象使用默認的 [[Get]] 內部方法。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號