html代码在线运行环境,ES5/可执行代码与执行环境
可執行代碼類型
一共有三種 ECMA 腳本可執行代碼:
全局代碼是指被作為 ECMAScript
Eval 代碼是指提供給 eval 內置函數的源代碼文本。更精確地說,如果傳遞給 eval 內置函數的參數為一個字符串,該字符串將被作為 ECMA 腳本 eval 的調用過程中,eval 代碼作為該 全局代碼部分。
函數代碼是指作為 函數代碼不包括作為其嵌套函數的 函數代碼同時還特指以構造器方式調用 Function 內置對象時所提供的源代碼文本。更精確地說,調用 Function 構造器時傳遞的最后一個參數將被轉換為字符串并作為 Function 構造器時,傳遞了一個以上的參數,除最后一個參數以外的其他參數都將轉換為字符串,并以逗號作為分隔符連接在一起成為一個字符串,該字符串被解析為 Function 對象時所提供的函數代碼,并不包括作為其嵌套函數的
嚴格模式下的代碼
一個 ECMA 腳本程序的語法單元可以使用非嚴格或嚴格模式下的語法及語義進行處理。當使用嚴格模式進行處理時,以上三種代碼將被稱為嚴格全局代碼、嚴格 eval 代碼和嚴格函數代碼。當符合以下條件時,代碼將被解析為嚴格模式下的代碼:
詞法環境
詞法環境是一個用于定義特定變量和函數標識符在 ECMAScript 代碼的詞法嵌套結構上關聯關系的規范類型。一個詞法環境由一個環境記錄項和可能為空的外部詞法環境引用構成。通常詞法環境會與 ECMAScript 代碼諸如 詞法環境被創建出來。
環境記錄項記錄了在其關聯的詞法環境范圍中創建的標識符綁定。
外部詞法環境引用用于表示詞法環境的邏輯嵌套關系模型。(內部)詞法環境的外部引用是邏輯上包含內部詞法環境的詞法環境。外部詞法環境自然也可能有多個內部詞法環境。例如,如果一個
--Undefined (talk) 04:46, 28 January 2014 (UTC)詞法環境和環境記錄項是純粹的規范機制,而不需要 ECMAScript 的實現保持一致。ECMAScript 程序不可能直接訪問或者更改這些值。
環境記錄項
出于標準規范的目的,可以將環境記錄項理解為面向對象中的一個簡單繼承結構,其中環境記錄項是一個抽象類,有兩個具體實現類,分別為聲明式環境記錄項和對象式環境記錄項。抽象類包含了 表17 所描述的抽象方法定義,針對每一個具體實現類,每個抽象方法都有不同的具體算法。
表17 - 環境記錄項的抽象方法
方法
作用
HasBinding(N)
判斷環境記錄項是否包含對某個標識符的綁定。如果包含該綁定則返回 true,反之返回 false。其中字符串 N 是標識符文本。
CreateMutableBinding(N, D)
在環境記錄項中創建一個新的可變綁定。其中字符串 N 指定綁定名稱。如果可選參數 D 的值為 true,則該綁定在后續操作中可以被刪除。
SetMutableBinding(N, V, S)
在環境記錄項中設置一個已經存在的綁定的值。其中字符串 N 指定綁定名稱。V 用于指定綁定的值,可以是任何 ECMA 腳本語言的類型。S 是一個布爾類型的標記,當 S 為 true 并且該綁定不允許賦值時,則拋出一個 TypeError 異常。S 用于指定是否為嚴格模式。
GetBindingValue(N, S)
返回環境記錄項中一個已經存在的綁定的值。其中字符串 N 指定綁定的名稱。S 用于指定是否為嚴格模式。如果 S 的值為 true 并且該綁定不存在或未初始化,則拋出一個 ReferenceError 異常。
DeleteBinding(N)
從環境記錄項中刪除一個綁定。其中字符串 N 指定綁定的名稱。如果 N 指定的綁定存在,將其刪除并返回 true。如果綁定存在但無法刪除則返回 false。如果綁定不存在則返回 true。
ImplicitThisValue()
當從該環境記錄項的綁定中獲取一個函數對象并且調用時,該方法返回該函數對象使用的 this 對象的值。
聲明式環境記錄項
每個聲明式環境記錄項都與一個包含變量和(或)函數聲明的 ECMA 腳本的程序作用域相關聯。聲明式環境記錄項用于綁定作用域內定義的一系列標識符。
除了所有環境記錄項都支持的可變綁定外,聲明式環境記錄項還提供不可變綁定。
在不可變綁定中,一個標識符與它的值之間的關聯關系建立之后,就無法改變。創建和初始化不可變綁定是兩個獨立的過程,因此類似的綁定可以處在已初始化階段或者未初始化階段。除了環境記錄項定義的抽象方法外,聲明式環境記錄項還支持 表18 中列出的方法:
表18 - 聲明式環境記錄項的額外方法
方法
作用
在環境記錄項中創建一個未初始化的不可變綁定。其中字符串 N 指定綁定名稱。
在環境記錄項中設置一個已經創建但未初始化的不可變綁定的值。其中字符串 N 指定綁定名稱。V 用于指定綁定的值,可以是任何 ECMA 腳本語言的類型。
環境記錄項定義的方法的具體行為將由以下算法給予描述。
HasBinding(N)
聲明式環境記錄項的 HasBinding 具體方法用于簡單地判斷作為參數的標識符是否是當前對象綁定的標識符之一:
令 envRec 為函數調用時對應的聲明式環境記錄項。
如果 envRec 有一個名稱為 N 的綁定,返回 true。
如果沒有該綁定,返回 false。
CreateMutableBinding(N, D)
聲明式環境記錄項的 CreateMutableBinding 具體方法會創建一個名稱為 N 的綁定,并初始化其值為 undefined。方法調用時,當前環境記錄項中不能存在 N 的綁定。如果調用時提供了布爾類型的參數 D 且其值為 true,則新建的綁定被標記為可刪除。
令 envRec 為函數調用時對應的聲明式環境記錄項。
執行斷言:envRec 沒有 N 的綁定。
在 envRec 中為 N 創建一個可變綁定,并將綁定的值設置為 undefined。如果 D 為 true 則新創建的綁定可在后續操作中通過調用 DeleteBinding 刪除。
SetMutableBinding(N, V, S)
聲明式環境記錄項的 SetMutableBinding 具體方法嘗試將當前名稱為參數 N 的綁定的值修改為參數 V 指定的值。方法調用時,必須存在 N 的綁定。如果該綁定為不可變綁定,并且 S 的值為 true,則拋出一個 TypeError 異常。
令 envRec 為函數調用時對應的聲明式環境記錄項。
執行斷言:envRec 必須有 N 的綁定。
如果 envRec 中 N 的綁定為可變綁定,則將其值修改為 V。
否則該操作會嘗試修改一個不可變綁定的值,因此如果 S 的值為 true,則拋出一個 TypeError 異常。
GetBindingValue(N, S)
聲明式環境記錄項的 GetBindingValue 具體方法簡單地返回名稱為參數 N 的綁定的值。方法調用時,該綁定必須存在。如果 S 的值為 true 且該綁定是一個未初始化的不可變綁定,則拋出一個 ReferenceError 異常。
令 envRec 為函數調用時對應的聲明式環境記錄項。
執行斷言:envRec 必須有 N 的綁定。
如果 envRec 中 N 的綁定是一個未初始化的不可變綁定,則:
如果 S 為 false,返回 undefined,否則拋出一個 ReferenceError 異常。
否則返回 envRec 中與 N 綁定的值。
DeleteBinding(N)
聲明式環境記錄項的 DeleteBinding 具體方法只能刪除顯示指定可被刪除的那些綁定。
令 envRec 為函數調用時對應的聲明式環境記錄項。
如果 envRec 不包含名稱為 N 的綁定,返回 true。
如果 envRec 中 N 的綁定不能刪除,返回 false。
移除 envRec 中 N 的綁定。
返回 true。
ImplicitThisValue()
聲明式環境記錄項永遠將 undefined 作為其 ImplicitThisValue 返回。
返回 undefined。
CreateImmutableBinding(N)
聲明式環境記錄項的 CreateImmutableBinding 具體方法會創建一個不可變綁定,其名稱為 N 且初始化其值為 undefined。調用方法時,該環境記錄項中不得存在 N 的綁定。
令 envRec 為函數調用時對應的聲明式環境記錄項。
執行斷言:envRec 不存在 N 的綁定。
在 envRec 中為 N 創建一個不可變綁定,并記錄為未初始化。
InitializeImmutableBinding(N, V)
聲明式環境記錄項的 InitializeImmutableBinding 具體方法用于將當前名稱為參數 N 的綁定的值修改為參數 V 指定的值。方法調用時,必須存在 N 對應的未初始化的不可變綁定。
令 envRec 為函數調用時對應的聲明式環境記錄項。
執行斷言:envRec 存在一個與 N 對應的未初始化的不可變綁定。
在 envRec 中將 N 的綁定的值設置為 V。
在 envRec 中將 N 的不可變綁定記錄為已初始化。
對象式環境記錄項
每一個對象式環境記錄項都有一個關聯的對象,這個對象被稱作綁定對象。對象式環境記錄項直接將一系列標識符與其綁定對象的屬性名稱建立一一對應關系。不符合 標識符使用。無論是對象自身的,還是繼承的屬性都會作為綁定,無論該屬性的 [[Enumerable]] 特性的值是什么。由于對象的屬性可以動態的增減,因此對象式環境記錄項所綁定的標識符集合也會隱匿地變化,這是增減綁定對象的屬性而產生的副作用。通過以上描述的副作用而建立的綁定,均被視為可變綁定,即使該綁定對應的屬性的 [[Writable]] 特性的值為 false。對象式環境記錄項沒有不可變綁定。
對象式環境記錄項可以通過配置的方式,將其綁定對象合為函數調用時的隱式 this 對象的值。這一功能用于規范 對象式環境記錄項中布爾類型的 provideThis 值控制,默認情況下,provideThis 的值為 false。
環境記錄項定義的方法的具體行為將由以下算法給予描述。
HasBinding(N)
對象式環境記錄項的 HasBinding 具體方法判斷其關聯的綁定對象是否有名為 N 的屬性:
令 envRec 為函數調用時對應的聲明式環境記錄項。
令 bindings 為 envRec 的綁定對象。
以 N 為屬性名,調用 bindings 的 [[HasProperty]] 內部方法,并返回調用的結果。
CreateMutableBinding(N, D)
對象式環境記錄項的 CreateMutableBinding具體方法會在其關聯的綁定對象上創建一個名稱為 N 的屬性,并初始化其值為 undefined。調用方法時,綁定對象不得包含名稱為 N 的屬性。如果調用方法時提供了布爾類型的參數 D 且其值為 true,則設置新創建的屬性的 [[Configurable]] 特性的值為 true,否則設置為 false。
令 envRec 為函數調用時對應的聲明式環境記錄項。
令 bindings 為 envRec 的綁定對象。
執行斷言:以 N 為屬性名,調用 bindings 的 [[HasProperty]] 內部方法,調用的結果為 false。
如果 D 的值為 true,則令 configValue 的值為 true,否則令 configValue 的值為 false。
以 N、屬性描述符 {[[Value]]:undefined, [[Writable]]: true, [[Enumerable]]: true , [[Configurable]]: configValue} 和布爾值 true 為參數,調用 bindings 的 [[DefineOwnProperty]] 內部方法。
SetMutableBinding(N, V, S)
對象式環境記錄項的 SetMutableBinding 具體方法會嘗試設置其關聯的綁定對象中名為 N 的屬性的值為 V。方法調用時,綁定對象中應當存在該屬性,如果該屬性不存在或屬性不可寫,則根據 S 參數的值來執行錯誤處理。
令 envRec 為函數調用時對應的聲明式環境記錄項。
令 bindings 為 envRec 的綁定對象
以 N、V 和 S 為參數,調用 bindings 的 [[Put]] 內部方法。
GetBindingValue(N, S)
對象式環境記錄項的 GetBindingValue 具體方法返回其關聯的綁定對象中名為 N 的屬性的值。方法調用時,綁定對象中應當存在該屬性,如果該屬性不存在,則方法的返回值由 S 參數決定:
令 envRec 為函數調用時對應的聲明式環境記錄項。
令 bindings 為 envRec 的綁定對象
以 N 為屬性名,調用 bindings 的 [[HasProperty]] 內部方法,并令 value 為調用的結果。
如果 value 的值為 false,則:
如果 S 的值為 false,則返回 undefined,否則拋出一個 ReferenceError 異常。
以 N 為參數,調用 bindings 的 [[Get]] 內部方法,并返回調用的結果。
DeleteBinding(N)
對象式環境記錄項的 DeleteBinding 具體方法只能用于刪除其關聯的綁定對象上 [[Configurable]] 特性的值為 true 的屬性所對應的綁定。
令 envRec 為函數調用時對應的聲明式環境記錄項。
令 bindings 為 envRec 的綁定對象
以 N 和布爾值 false 為參數,調用 bindings 的 [[Delete]] 內部方法。
ImplicitThisValue()
對象式環境記錄項的 ImplicitThisValue 通常返回 undefined,除非其 provideThis 標識的值為 true。
令 envRec 為函數調用時對應的對象式環境記錄項。
如果 envRec 的 provideThis 標識的值為 true,返回 envRec 的綁定對象。
否則返回 undefined。
詞法環境的運算
在本標準中,以下抽象運算將被用于操作環境記錄項:
GetIdentifierReference(lex, name, strict)
當調用 GetIdentifierReference 抽象運算時,需要指定一個詞法環境 lex,一個標識符字符串 name 以及一個布爾型標識 strict。lex 的值可以為 null。當調用該運算時,按以下步驟進行:
如果 lex 的值為 null,則:
返回一個類型為引用的對象,其基值為 undefined,引用的名稱為 name,嚴格模式標識的值為 strict。
令 envRec 為 lex 的環境數據。
以 name 為參數 N,調用 envRec 的 HasBinding(N) 具體方法,并令 exists 為調用的結果。
如果 exists 為 true,則:
返回一個類型為引用的對象,其基值為 envRec,引用的名稱為 name,嚴格模式標識的值為 strict。
否則:
令 outer 為 lex 的外部環境引用。
以 outer、name 和 strict 為參數,調用 GetIdentifierReference,并返回調用的結果。
NewDeclarativeEnvironment(E)
當調用 NewDeclarativeEnvironment 抽象運算時,需指定一個詞法環境 E,其值可以為 null,此時按以下步驟進行:
令 env 為一個新建的詞法環境。
令 envRec 為一個新建的聲明式環境數據,該環境數據不包含任何綁定。
令 env 的環境數據為 envRec。
令 env 的外部詞法環境引用至 E。
返回 env。
NewObjectEnvironment(O, E)
當調用 NewObjectEnvironment 抽象運算時,需指定一個對象 O 及一
個詞法環境 E(其值可以為 null),此時按以下步驟進行:
令 env 為一個新建的詞法環境。
令 envRec 為一個新建的對象環境數據,該環境數據包含 O 作為綁定對象。
令 env 的環境數據為 envRec。
令 env 的外部詞法環境引用至 E。
返回 env。
全局環境
全局環境是一個唯一的詞法環境,它在任何 ECMA 腳本的代碼執行前創建。全局環境的環境數據是一個對象環境數據,該環境數據使用全局對象(15.1)作為綁定對象。全局環境的外部環境引用為 null。
在 ECMA 腳本的代碼執行過程中,可能會向全局對象添加額外的屬性,也可能修改其初始屬性的值。
執行環境
當控制器轉入 ECMA 腳本的可執行代碼時,控制器會進入一個執行環境。當前活動的多個執行環境在邏輯上形成一個棧結構。該邏輯棧的最頂層的執行環境稱為當前運行的執行環境。任何時候,當控制器從當前運行的執行環境相關的可執行代碼轉入與該執行環境無關的可執行代碼時,會創建一個新的執行環境。新建的這個執行環境會推入棧中,成為當前運行的執行環境。
執行環境包含所有用于追蹤與其相關的代碼的執行進度的狀態。精確地說,每個執行環境包含如 表19 列出的組件。
表19 — 執行環境的狀態組件
組件
作用目的
詞法環境組件
指定一個詞法環境對象,用于解析該執行環境內的代碼創建的標識符引用。
變量環境組件
this 綁定
指定該執行環境內的 ECMA 腳本代碼中 this 關鍵字所關聯的值。
其中執行環境的詞法環境組件和變量環境組件始終為詞法環境對象。當創建一個執行環境時,其詞法環境組件和變量環境組件最初是同一個值。在該執行環境相關聯的代碼的執行過程中,變量環境組件永遠不變,而詞法環境組件有可能改變。
在本標準中,通常情況下,只有正在運行的執行環境(執行環境棧里的最頂層對象)會被算法直接修改。因此當遇到“詞法環境組件”、“變量環境組件”、“this 綁定組件”這三個術語時,指的是正在運行的執行環境的對應組件。
執行環境是一個純粹的標準機制,并不代表任何 ECMA 腳本實現的工件。在 ECMA 腳本程序中是不可能訪問到執行環境的。
標識符解析
標識符解析是指使用正在運行的執行環境中的詞法環境組件,通過一個 :
令 env 為正在運行的執行環境的 詞法環境組件。
如果正在解釋執行的語法產生式處在嚴格模式下的代碼中,則僅 strict 的值為 true,否則令 strict 的值為 false。
解釋執行一個標識符得到的結果必定是引用類型的對象,且其引用名屬性的值與
建立執行環境
解釋執行全局代碼或使用 eval 函數輸入的代碼會創建并進入一個新的執行環境。每次調用 ECMA 腳本代碼定義的函數(13.2.1)也會建立并進入一個新的執行環境,即便函數是自身遞歸調用的。每一次 return 都會退出一個執行環境。拋出異常也可退出一個或多個執行環境。
當控制流進入一個執行環境時,會設置該執行環境的 this 綁定組件,定義變量環境和初始詞法環境,并執行聲明式綁定初始化過程。以上這些步驟的嚴格執行方式由進入的代碼的類型決定。
進入全局代碼
當控制流進入全局代碼的執行環境時,執行以下步驟:
按 10.4.1.1 描述的方案,使用全局代碼初始化執行環境。
初始化全局執行環境
以下步驟描述 ECMA 腳本的全局執行環境 C 的創建過程:
進入 eval 代碼
當控制流進入 eval代碼 的執行環境時,執行以下步驟:
如果沒有調用環境,或者 eval代碼 并非通過直接調用 eval 函數來解釋執行的 ,則
按(10.4.1.1)描述的初始化全局執行環境的方案,以 eval代碼 作為 C 來初始化執行環境。
如果 eval 代碼是嚴格模式下的代碼,則
令 strictVarEnv 為以詞法環境為參數調用 NewDeclarativeEnvironment 得到的結果。
設置 詞法環境組件 為 strictVarEnv。
設置 變量環境組件 為 strictVarEnv。
嚴格模式下的限制
如果調用環境的代碼或 eval 代碼是嚴格模式下的代碼,則 eval 代碼不能在調用環境的 變量環境組件 中初始化變量及函數綁定。與之相對的,變量及函數綁定將在一個新的 變量環境組件 中被初始化,該 變量環境組件 僅可被 eval 代碼訪問。
進入函數代碼
當控制流根據一個函數對象 F、調用者提供的 thisArg 以及調用者提供的 argumentList,進入函數代碼的執行環境時,執行以下步驟:
否則如果 thisArg 是 null 或 undefined,則設 this 綁定 為全局對象。
否則如果 Type(thisArg) 的結果不為 Object,則設 this 綁定 為 ToObject(thisArg)。
否則設 this 綁定 為 thisArg。
設 詞法環境組件 為 localEnv。
設 變量環境組件 為 localEnv。
令 code 為 F 的 [[Code]] 內部屬性的值。
按 10.5 描述的方案,使用函數代碼 code 和 argumentList 執行聲明式綁定初始化化步驟。
聲明式綁定初始化
每個執行環境都有一個關聯的 變量環境組件。當在一個執行環境下評估一段 ECMA 腳本時,變量和函數定義會以綁定的形式添加到這個 變量環境組件 的環境記錄中。對于函數代碼,參數也同樣會以綁定的形式添加到這個 變量環境組件 的環境記錄中。
選擇使用哪一個、哪一類型的環境記錄來綁定定義,是由執行環境下執行的 ECMA 腳本的類型決定的,而其它部分的邏輯是相同的。當進入一個執行環境時,會按以下步驟在 變量環境組件 上創建綁定,其中使用到調用者提供的代碼設為 code,如果執行的是函數代碼,則設參數列表為 args:
令 env 為當前運行的執行環境的變量環境組件的環境記錄項。
如果 code 是 eval 代碼,則令 configurableBindings 為 true,否則令 configurableBindings 為 false。
如果代碼是嚴格模式下的代碼,則令 strict 為 true,否則令 strict 為 false。
如果代碼為函數代碼,則:
令 func 為通過 [[Call]] 內部屬性初始化 code 的執行的函數對象。令 names 為 func 的 [[FormalParameters]] 內部屬性的值。
令 argCount 為 args 中元素的數量。
令 n 為數值 0。
按列表順序遍歷 names,對于每一個字符串 argName:
令 n 的值為 n 當前值加 1。
如果 n 大于 argCount,則令 v 為 undefined,否則令 v 為 args 中的第 n 個元素。
以 argName 為參數,調用 env 的 HasBinding 具體方法,并令 argAlreadyDeclared 為調用的結果。
如果 argAlreadyDeclared 的值為 false,以 argName 為參數調用 env 的 CreateMutableBinding 具體方法。
以 argName、v 和 strict 為參數,調用 env 的 SetMutableBinding 具體方法。
按源碼順序遍歷 code,對于每一個 FunctionDeclaration f:
以 fn 為參數,調用 env 的 HasBinding 具體方法,并令 argAlreadyDeclared 為調用的結果。
如果 argAlreadyDeclared 的值為 false,以 fn 和 configurableBindings 為參數調用 env 的 CreateMutableBinding 具體方法。
否則如果 env 是全局環境的環境記錄對象,則:
令 go 為全局對象。
以 fn 為參數,調用 go 和 [[GetProperty]] 內部方法,并令 existingProp 為調用的結果。
如果 existingProp.[[Configurable]] 的值為 true,則:
以 fn、由 {[[Value]]: undefined, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: configurableBindings } 組成的屬性描述符和 true 為參數,調用 go 的 [[DefineOwnProperty]] 內部方法。
否則如果 IsAccessorDescriptor(existingProp) 的結果為真,或 existingProp 的特性中沒有 {[[Writable]]: true, [[Enumerable]]: true},則:
拋出一個 TypeError 異常。
以 fn、fo 和 strict 為參數,調用 env 的 SetMutableBinding 具體方法。
以 "arguments" 為參數,調用 env 的 HasBinding 具體方法,并令 argumentsAlreadyDeclared 為調用的結果。
如果 code 是函數代碼,并且 argumentsAlreadyDeclared 為 false,則:
以 fn、names、args、env 和 strict 為參數,調用 CreateArgumentsObject 抽象運算函數,并令 argsObj 為調用的結果。
如果 strict 為 true,則:
以字符串"arguments"為參數,調用 env 的 CreateImmutableBinding 具體方法。
以字符串 "arguments" 和 argsObj 為參數,調用 env 的 InitializeImmutableBinding 具體函數。
否則:
以字符串 "arguments"為參數,調用 env 的 CreateMutableBinding 具體方法。
以字符串"arguments"、argsObj 和 false 為參數,調用 env 的 SetMutableBinding 具體函數。
按源碼順序遍歷 code,對于每一個 d 執行:
令 dn 為 d 中的標識符。
以 dn 為參數,調用 env 的 HasBinding 具體方法,并令 varAlreadyDeclared 為調用的結果。
如果 varAlreadyDeclared 為 false,則:
以 dn 和 configurableBindings 為參數,調用 env 的 CreateMutableBinding 具體方法。
以 dn、undefined 和 strict 為參數,調用 env 的 SetMutableBinding 具體方法。
創建 Arguments 對象
當控制器進入到函數代碼的執行環境時,將創建一個 arguments 對象(透過 10.5 指定的方式),除非它作為標識符 arguments 出現在該函數的形參列表中,或者是該函數代碼內部的變量聲明標識符或函數聲明標識符。
arguments 對象通過調用抽象方法 CreateArgumentsObject 創建,調用時將以下參數傳入:func、names、args、env、strict。將要執行的函數對象作為 func 參數,將該函數的所有形參名加入一個列表,稱為 names 參數,將所有傳給內部方法 [[Call]] 的實際參數,稱為 args 參數,將該函數代碼的變量環境稱為 env 參數,將該函數代碼是否為嚴格代碼作為 strict 參數。當 CreateArgumentsObject 調用時,按照以下步驟執行:
令 len 為參數 args 的元素個數。
令 obj 為一個新建的 ECMAScript 對象。
按照 8.12 章節中的規范去設定 obj 對象的所有內部方法。
將 obj 對象的內部屬性 [[Class]] 設置為 "Arguments"。
令 Object 為標準的內置對象的構造函數(15.2.2)。
將 obj 對象的內部屬性 [[Prototype]] 設置為標準的內置對象的原型對象。
調用 obj 的內部方法 [[DefineOwnProperty]],將 "length" 傳遞進去,屬性描述符為:{[[Value]]: len, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true},參數為 false。
令 map 為表達式 new Object() 創建的對象,就是名為 Object 的標準的內置構造函數。
令 mappedNames 為一個空的列表。
令 indx = len - 1
當 indx >= 0 的時候,重復此過程:
令 val 為 args(維度從 0 開始的列表)的第 indx 維度所在的元素。
調用 obj 的內部方法 [[DefineOwnProperty]],將 ToString(indx) 傳遞進去,屬性描述符為:{[[Value]]: val, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true},參數為 false。
如果 indx 小于 names 的元素個數,則
令 name 為 names(維度從 0 開始的列表)的第 indx 維度所在的元素。
如果 strict 值為 false,且 name 不是一個 mappedNames 元素,則
將 name 添加到 mappedNames 列表中,作為它的一個元素
令 g 為調用抽象操作 MakeArgGetter 的結果,其參數為 name 和 env。
令 p 為調用抽象操作 MakeArgSetter 的結果,其參數為 name 和 env。
調用 map 對象的內部方法 [[DefineOwnProperty]],將 ToString(indx) 傳遞進去,屬性描述符為:{[[Set]]: p, [[Get]]: g, [[Configurable]]: true},參數為 false。
令 indx = indx - 1
如果 strict 值為 false,則
調用 obj 對象的內部方法 [[DefineOwnProperty]],將 "callee" 傳遞進去,屬性描述符為:{[[Value]]: func, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true},參數為 false。
否則,strict 值為 true,那么
調用 obj 對象的內部方法 [[DefineOwnProperty]],將 "caller" 傳遞進去,屬性描述符為:{[[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},參數為 false。
調用 obj 對象的內部方法 [[DefineOwnProperty]],將 "callee" 傳遞進去,屬性描述符為:{[[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},參數為 false。
返回 obj。
抽象操作 MakeArgGetter 以字符串 name 和環境記錄 env 作為參數被調用時,會創建一個函數對象,當執行完后,會返回在 env 中綁定的 name 的值。執行步驟如下:
令 body 為字符 "return "、name、";" 的連接字符串。
返回一個按照 13.2 章節中描述的方式創建的函數對象,它不需要形參列表,以 body 作為它的 env 作為它的 Scope,并且 strict 值為 true。
抽象操作 MakeArgSetter 以字符串 name 和環境記錄 env 作為參數被調用時,會創建一個函數對象,當執行完后,會給在 env 中綁定的 name 設置一個值。執行步驟如下:
令 param 為 name 和字符串 "_arg" 的連接字符串。
令 body 為字符串 "=;";將 替換為 name 的值,將 替換為 param 的值。
返回一個按照 13.2 章節中描述的方式創建的函數對象,以一個只包含字符串 param 的列表作為它的形參,以 body 作為它的函數體(env 作為它的 Scope,并且 strict 值為 true。
當 arguments 對象的內部方法 [[Get]] 在一個非嚴格模式下帶有形參的函數中,在一個屬性名為 P 的條件下被調用時,其執行步驟如下:
令 map 為 arguments 對象的內部屬性 [[ParameterMap]]。
令 isMapped 為 map 對象的內部方法 [[GetOwnPropery]] 傳入參數 P 的執行結果。
如果 isMapped 值為 undefined,則
令 v 為 arguments 對象的內部默認的 [[Get]] 方法(8.12.3),傳入參數 P 的執行結果。
如果 P 為 "caller",且 v 為嚴格模式下的 Function 對象,則拋出一個 TypeError 的異常。
返回 v。
否則,map 包含一個 P 的形參映射表。
返回 map 對象的內部方法 [[Get]] 傳入參數 P 的執行結果。
當 arguments 對象的內部方法 [[GetOwnProperty]] 在一個非嚴格模式下帶有形參的函數中,在一個屬性名為 P 的條件下被調用時,其執行步驟如下:
令 desc 為 arguments 對象的內部方法 [[GetOwnProperty]](8.12.1)傳入參數 P 的執行結果。
如果 desc 為 undefined,返回 desc。
令 map 為 arguments 對象內部屬性 [[ParameterMap]] 的值。
令 isMapped 為 map 對象的內部方法 [[GetOwnPropery]] 傳入參數 P 的執行結果。
如果 isMapped 的值不是 undefined,則
將 desc.[[Value]] 的值設置為 map 對象的內部方法 [[Get]] 傳入參數 P 的執行結果。
返回 desc。
當 arguments 對象的內部方法 [[DefineOwnProperty]] 在一個非嚴格模式下帶有形參的函數中,在一個屬性名為 P,屬性描述符為 Desc,布爾標志為 Throw 的條件下被調用時,其執行步驟如下:
令 map 為 arguments 對象的內部屬性 [[ParameterMap]] 的值。
令 isMapped 為 map 對象的內部方法 [[GetOwnPropery]] 傳入參數 P 的執行結果。
令 allowed 為 arguments 對象的內部方法 [[DefineOwnPropery]](8.12.9)傳入參數 P、Desc、false 的執行結果。
如果 allowed 為 false,則
如果 Throw 為 true,則拋出一個 TypeError 的異常,否則,返回 false。
如果 isMapped 的值不為 undefined,則
如果 IsIsAccessorDescriptor(Desc) 為 true,則
調用 map 對象的內部方法 [[Delete]],傳入 P 和 false 作為參數。
否則
如果 Desc.[[Value]] 存在,則
調用 map 對象的內部方法 [[Put]],傳入 P、Desc.[[Value]] 和 Throw 作為參數。
如果 Desc.[[Writable]] 存在,且其值為 false,則
調用 map 對象的內部方法 [[Delete]],傳入 P 和 false 作為參數。
返回 true。
當 arguments 對象的內部方法 [[Delete]] 在一個非嚴格模式下帶有形參的函數中,在一個屬性名為 P,布爾標志為 Throw 的條件下被調用時,其執行步驟如下:
令 map 為 arguments 對象的內部屬性 [[ParameterMap]] 的值。
令 isMapped 為 map 對象的內部方法 [[GetOwnPropery]] 傳入參數 P 的執行結果。
令 result 為 arguments 對象的內部方法 [[Delete]](8.12.7)傳入參數 P 和 Throw 的執行結果。
如果 result 為 true,且 isMapped 不為 undefined,則
調用 map 對象的內部方法 [[Delete]],傳入 P 和 false 作為參數。
返回 result。
注: 非嚴格模式下的函數,arguments 對象以數組索引(參見 15.4 的定義)作為數據屬性的命名,其數字名字的值少于對應的函數對象初始時的形參數量,它們與綁定在該函數執行環境中對應的參數共享值。這意味著,改變該屬性將改變這些對應的、綁定的參數的值,反之亦然。如果其中一個屬性被刪除然后再對其重定義,或者其中一個屬性在某個訪問器屬性內部被更改,則這種對應關系將被打破。嚴格模式下的函數,arguments 對象的屬性值就是傳入該函數的實際參數的簡單拷貝,它們與形參之間的值不存在動態的聯動關系。
注: ParameterMap 對象和它的屬性值被作為說明 arguments 對象對應綁定參數的裝置。ParameterMap 對象和它的屬性值對象不能直接被 ECMAScript 代碼訪問。作為 ECMAScript 的實現,不需要實際創建或使用這些對象去實現指定的語義。
注: 嚴格模式下函數的 Arguments 對象定義的非可配置的訪問器屬性,"caller" 和 "callee",在它們被訪問時,將拋出一個 TypeError 的異常。在非嚴格模式下,"callee" 屬性具有非常明確的意義,"caller" 屬性有一個歷史問題,它是否被提供,視為一個由實作環境決定的,在具體的 ECMAScript 實作進行擴展。在嚴格模式下對這些屬性的定義的出現是為了確保它們倆誰也不能在規范的 ECMAScript 實作中以任何方式被定義。
總結
以上是生活随笔為你收集整理的html代码在线运行环境,ES5/可执行代码与执行环境的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鸿蒙手机系统开发大会,鸿蒙OS+EMUI
- 下一篇: html右侧隐藏功能区,html – C