W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
詞法環(huán)境 是一個用于定義特定變量和函數標識符在 ECMAScript 代碼的詞法嵌套結構上關聯關系的規(guī)范類型。一個詞法環(huán)境由一個環(huán)境記錄項和可能為空的外部詞法環(huán)境引用構成。通常詞法環(huán)境會與特定的 ECMAScript 代碼諸如 FunctionDeclaration,WithStatement 或者 TryStatement 的 Catch 塊這樣的語法結構相聯系,且類似代碼每次執(zhí)行都會有一個新的語法環(huán)境被創(chuàng)建出來。
環(huán)境記錄項記錄了在它的關聯詞法環(huán)境域內創(chuàng)建的標識符綁定情形。
外部詞法環(huán)境引用用于表示詞法環(huán)境的邏輯嵌套關系模型。(內部)詞法環(huán)境的外部引用是邏輯上包含內部詞法環(huán)境的詞法環(huán)境。外部詞法環(huán)境自然也可能有多個內部詞法環(huán)境。例如,如果一個 FunctionDeclaration 包含兩個嵌套的 FunctionDeclaration,那么每個內嵌函數的詞法環(huán)境都是外部函數本次執(zhí)行所產生的詞法環(huán)境。
詞法環(huán)境和環(huán)境記錄項是純粹的規(guī)范機制,而不需要 ECMAScript 的實現保持一致。ECMAScript 程序不可能直接訪問或者更改這些值。
在本標準中,共有 2 類環(huán)境記錄項: 聲明式環(huán)境記錄項 和 對象式環(huán)境記錄項 。聲明式環(huán)境記錄項用于定義那些將 標識符 與語言值直接綁定的 ECMA 腳本語法元素,例如 函數定義 , 變量定義 以及 Catch 語句。對象式環(huán)境記錄項用于定義那些將 標識符 與具體對象的屬性綁定的 ECMA 腳本元素,例如 程序 以及 With 表達式 。
出于標準規(guī)范的目的,可以將環(huán)境記錄項理解為面向對象中的一個簡單繼承結構,其中環(huán)境記錄項是一個抽象類花前月下有 2 個具體實現類,分別為聲明式環(huán)境記錄項和對象式環(huán)境記錄項。抽象類包含了表 17 所描述的抽象方法定義,針對每一個具體實現類,每個抽象方法都有不同的具體算法。
表17——環(huán)境記錄項的抽象方法方法 | 作用 |
---|---|
HasBinding(N) | 判斷環(huán)境記錄項是否包含對某個標識符的綁定。如果包含該綁定則返回 true,反之返回 false。其中字符串 N 是標識符文本。 |
CreateMutableBinding(N, D) | 在環(huán)境記錄項中創(chuàng)建一個新的可變綁定。其中字符串 N 指定綁定名稱。如果可選參數 D 的值為true,則該綁定在后續(xù)操作中可以被刪除。 |
SetMutableBinding(N,V, S) | 在環(huán)境記錄項中設置一個已經存在的綁定的值。其中字符串 N 指定綁定名稱。V 用于指定綁定的值,可以是任何 ECMA 腳本語言的類型。S 是一個布爾類型的標記,當 S 為 true 并且該綁定不允許賦值時,則拋出一個 TypeError 異常。S 用于指定是否為嚴格模式。 |
GetBindingValue(N,S) | 返回環(huán)境記錄項中一個已經存在的綁定的值。其中字符串 N 指定綁定的名稱。S 用于指定是否為嚴格模式。如果 S 的值為 true 并且該綁定不存在或未初始化,則拋出一個 ReferenceError 異常。 |
DeleteBinding(N) | 從環(huán)境記錄項中刪除一個綁定。其中字符串 N 指定綁定的名稱。如果 N 指定的綁定存在,將其刪除并返回 true。如果綁定存在但無法刪除則返回false。如果綁定不存在則返回 true。 |
ImplicitThisValue() | 當從該環(huán)境記錄項的綁定中獲取一個函數對象并且調用時,該方法返回該函數對象使用的 this 對象的值。 |
每個聲明式環(huán)境記錄項都與一個包含變量和(或)函數聲明的 ECMA 腳本的程序作用域相關聯。聲明式環(huán)境記錄項用于綁定作用域內定義的一系列標識符。
除了所有環(huán)境記錄項都支持的可變綁定外,聲明式環(huán)境記錄項還提供不可變綁定。在不可變綁定中,一個標識符與它的值之間的關聯關系建立之后,就無法改變。創(chuàng)建和初始化不可變綁定是兩個獨立的過程,因此類似的綁定可以處在已初始化階段或者未初始化階段。除了環(huán)境記錄項定義的抽象方法外,聲明式環(huán)境記錄項還支持表 18 中列出的方法:
表18——聲明式環(huán)境記錄項的額外方法方法 | 作用 |
---|---|
CreateImmutableBinding(N) | 在環(huán)境記錄項中創(chuàng)建一個未初始化的不可變綁定。其中字符串 N 指定綁定名稱。 |
InitializeImmutableBinding(N,V) | 在環(huán)境記錄項中設置一個已經創(chuàng)建但未初始化的不可變綁定的值。其中字符串 N 指定綁定名稱。V 用于指定綁定的值,可以是任何 ECMA 腳本語言的類型。 |
環(huán)境記錄項定義的方法的具體行為將由以下算法給予描述。
聲明式環(huán)境記錄項的 HasBinding 具體方法用于簡單地判斷作為參數的標識符是否是當前對象綁定的標識符之一:
聲明式環(huán)境記錄項的 CreateMutableBinding 具體方法會創(chuàng)建一個名稱為 N 的綁定,并初始化其值為 undefined。方法調用時,當前環(huán)境記錄項中不能存在 N 的綁定。如果調用時提供了布爾類型的參數 D 且其值為 true,則新建的綁定被標記為可刪除。
聲明式環(huán)境記錄項的 SetMutableBinding 具體方法嘗試將當前名稱為參數 N 的綁定的值修改為參數 V 指定的值。方法調用時,必須存在 N 的綁定。如果該綁定為不可變綁定,并且 S 的值為 true,則拋出一個 TypeError 異常。
聲明式環(huán)境記錄項的 GetBindingValue 具體方法簡單地返回名稱為參數 N 的綁定的值。方法調用時,該綁定必須存在。如果 S 的值為 true 且該綁定是一個未初始化的不可變綁定,則拋出一個 ReferenceError 異常。
聲明式環(huán)境記錄項的 DeleteBinding 具體方法只能刪除顯示指定可被刪除的那些綁定。
聲明式環(huán)境記錄項永遠將 undefined 作為其 ImplicitThisValue 返回。
聲明式環(huán)境記錄項的 CreateImmutableBinding 具體方法會創(chuàng)建一個不可變綁定,其名稱為 N 且初始化其值為 undefined。調用方法時,該環(huán)境記錄項中不得存在 N 的綁定。
聲明式環(huán)境記錄項的 InitializeImmutableBinding 具體方法用于將當前名稱為參數 N 的綁定的值修改為參數 V 指定的值。方法調用時,必須存在 N 對應的未初始化的不可變綁定。
每一個對象式環(huán)境記錄項都有一個關聯的對象,這個對象被稱作 綁定對象 。對象式環(huán)境記錄項直接將一系列標識符與其綁定對象的屬性名稱建立一一對應關系。不符合IdentifierName 的屬性名不會作為綁定的標識符使用。無論是對象自身的,還是繼承的屬性都會作為綁定,無論該屬性的 [[Enumerable]] 特性的值是什么。由于對象的屬性可以動態(tài)的增減,因此對象式環(huán)境記錄項所綁定的標識符集合也會隱匿地變化,這是增減綁定對象的屬性而產生的副作用。通過以上描述的副作用而建立的綁定,均被視為可變綁定,即使該綁定對應的屬性的 Writable 特性的值為 false。對象式環(huán)境記錄項沒有不可變綁定。
對象式環(huán)境記錄項可以通過配置的方式,將其綁定對象合為函數調用時的隱式 this 對象的值。這一功能用于規(guī)范 With 表達式(12.10 章 )引入的綁定行為。該行為通過對象式環(huán)境記錄項中布爾類型的 provideThis 值控制,默認情況下,provideThis 的值為 false。
環(huán)境記錄項定義的方法的具體行為將由以下算法給予描述。
對象式環(huán)境記錄項的 HasBinding 具體方法判斷其關聯的綁定對象是否有名為 N 的屬性:
對象式環(huán)境記錄項的 CreateMutableBinding 具體方法會在其關聯的綁定對象上創(chuàng)建一個名稱為 N 的屬性,并初始化其值為 undefined。調用方法時,綁定對象不得包含名稱為 N的屬性。如果調用方法時提供了布爾類型的參數 D 且其值為 true,則設置新創(chuàng)建的屬性的 [[Configurable]] 特性的值為 true,否則設置為 false。
對象式環(huán)境記錄項的 SetMutableBinding 具體方法會嘗試設置其關聯的綁定對象中名為 N 的屬性的值為 V。方法調用時,綁定對象中應當存在該屬性,如果該屬性不存在或屬性不可寫,則根據 S 參數的值來執(zhí)行錯誤處理。
對象式環(huán)境記錄項的 GetBindingValue 具體方法返回其關聯的綁定對象中名為 N 的屬性的值。方法調用時,綁定對象中應當存在該屬性,如果該屬性不存在,則方法的返回值由 S參數決定:
對象式環(huán)境記錄項的 DeleteBinding 具體方法只能用于刪除其關聯的綁定對象上 [[Configurable]] 特性的值為 true 的屬性所對應的綁定。
對象式環(huán)境記錄項的 ImplicitThisValue 通常返回 undefined,除非其 provideThis 標識的值為 true。
在本標準中,以下抽象運算將被用于操作環(huán)境記錄項:
當調用 GetIdentifierReference 抽象運算時,需要指定一個 詞法環(huán)境 lex,一個標識符字符串 name 以及一個布爾型標識 strict。lex 的值可以為 null。當調用該運算時,按以下步驟進行:
當調用 NewDeclarativeEnvironment 抽象運算時,需指定一個 詞法環(huán)境 E,其值可以為 null,此時按以下步驟進行:
當調用 NewObjectEnvironmentis 抽象運算時,需指定一個對象 O 及一個 詞法環(huán)境 E(其值可以為 null),此時按以下步驟進行:
全局環(huán)境 是一個唯一的 詞法環(huán)境 ,它在任何 ECMA 腳本的代碼執(zhí)行前創(chuàng)建。全局環(huán)境的 環(huán)境數據 是一個 #object-environment-record 對象環(huán)境數據,該環(huán)境數據使用 全局對象(15.1)作為 綁定對象 。全局環(huán)境的 外部環(huán)境引用 為 null。
在 ECMA 腳本的代碼執(zhí)行過程中,可能會向 全局對象 添加額外的屬性,也可能修改其初始屬性的值。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯系方式:
更多建議: