W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
當將 Function 作為函數來調用,而不是作為構造器,它會創(chuàng)建并初始化一個新函數對象。所以函數調用 Function(…) 與用相同參數的 new Function(…) 表達式創(chuàng)建的對象相同。
當以 p1, p2, … , pn, body 作為參數調用 Function 函數(這里的 n 可以是 0,也就是說沒有“p”參數,這時還可以不提供 body),采用如下步驟:
當 Function 作為 new 表達式的一部分被調用時,它是一個構造器:它初始化新創(chuàng)建的對象。
最后一個參數指定為函數的 body( 可執(zhí)行代碼 );之前的任何參數都指定為形式參數。
當以 p1, p2, … , pn, body 作為參數調用 Function 構造器(這里的 n 可以是 0,也就是說沒有“p”參數,這時還可以不提供 body),采用如下步驟:
每個函數都會自動創(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 構造器自身是個函數對象,它的 [[Class]] 是 "Function"。Function 構造器的 [[Prototype]] 內部屬性值是標準內置 Function 的 prototype 對象 (15.3.4)。
Function 構造器的 [[Extensible]] 內部屬性值是 true.
Function 構造器有如下屬性 :
Function.prototype 的初始值是標準內置 Function 的 prototype 對象 (15.3.4)。
此屬性擁有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。
這是個值為 1 的數據屬性。此屬性擁有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。
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 構造器。
此函數的返回值的表示是依賴于實現的。這個表示包含 FunctionDeclaration 的語法。特別注意,怎樣在這個字符串表示中使用和放置空白,行終結符,分號是依賴于實現的。
這個 toString 不是通用的;如果它的 this 值不是一個函數對象,它會拋出一個 TypeError 異常。因此,它不能當做方法來轉移到其他類型的對象中。
當以 thisArg 和 argArray 為參數在一個 func 對象上調用 apply 方法,采用如下步驟:
apply 方法的 length 屬性是 2。
在外面?zhèn)魅氲?thisArg 值會修改并成為 this 值。thisArg 是 undefined 或 null 時它會被替換成全局對象,所有其他值會被應用 ToObject 并將結果作為 this 值,這是第三版引入的更改。
當以 thisArg 和可選的 arg1, arg2 等等作為參數在一個 func 對象上調用 call 方法,采用如下步驟:
call 方法的 length 屬性是 1。
在外面?zhèn)魅氲?thisArg 值會修改并成為 this 值。thisArg 是 undefined 或 null 時它會被替換成全局對象,所有其他值會被應用 ToObject 并將結果作為 this 值,這是第三版引入的更改。
bind 方法需要一個或更多參數,thisArg 和(可選的)arg1, arg2, 等等,執(zhí)行如下步驟返回一個新函數對象:
bind 方法的 length 屬性是 1。
Function.prototype.bind 創(chuàng)建的函數對象不包含 prototype 屬性或 [[Code]], [[FormalParameters]], [[Scope]] 內部屬性。
當調用一個用 bind 函數創(chuàng)建的函數對象 F 的 [[Call]] 內部方法,傳入一個 this 值和一個參數列表 ExtraArgs,采用如下步驟:
當調用一個用 bind 函數創(chuàng)建的函數對象 F 的 [[Construct]] 內部方法,傳入一個參數列表 ExtraArgs,采用如下步驟:
當調用一個用 bind 函數創(chuàng)建的函數對象 F 的 [[Construct]] 內部方法,并以 V 作為參數,采用如下步驟:
除了必要的內部屬性之外,每個函數實例還有一個 [[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 屬性指定的數量不同的參數個數調用函數時,它的行為依賴于函數自身。這個屬性擁有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。
prototype 屬性的值用于初始化一個新創(chuàng)建對象的的 [[Prototype]] 內部屬性,為了這個新創(chuàng)建對象要先將函數對象作為構造器調用。這個屬性擁有特性 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }。
用 Function.prototype.bind 創(chuàng)建的函數對象沒有 prototype 屬性。
設 F 是個函數對象。
當以 V 作為參數調用 F 的 [[HasInstance]] 內部方法,采用如下步驟:
用 Function.prototype.bind 創(chuàng)建的函數對象擁有的不同的 [[HasInstance]] 實現,在 15.3.4.5.3 中定義。
函數對象與其他原生 EMACScript 對象 (8.12.3) 用不同的 [[Get]] 內部方法。
設 F 是一個函數對象,當以屬性名 P 調用 F 的 [[Get]] 內部方法 , 采用如下步驟:
用 Function.prototype.bind 創(chuàng)建的函數對象使用默認的 [[Get]] 內部方法。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯系方式:
更多建議: