建立執(zhí)行環(huán)境

2018-06-16 15:16 更新

解釋執(zhí)行 全局代碼 或使用 eval 函數(shù)(15.1.2.1)輸入的代碼會(huì)創(chuàng)建并進(jìn)入一個(gè)新的執(zhí)行環(huán)境。每次調(diào)用 ECMA 腳本代碼定義的函數(shù)(13.2.1)也會(huì)建立并進(jìn)入一個(gè)新的執(zhí)行環(huán)境,即便函數(shù)是自身遞歸調(diào)用的。每一次 return 都會(huì)退出一個(gè)執(zhí)行環(huán)境。拋出異常也可退出一個(gè)或多個(gè)執(zhí)行環(huán)境。

 當(dāng)控制流進(jìn)入一個(gè)執(zhí)行環(huán)境時(shí),會(huì)設(shè)置該執(zhí)行環(huán)境的 this 綁定,定義變量環(huán)境和初始詞法環(huán)境,并執(zhí)行定義綁定初始化過程(10.5)。以上這些步驟的嚴(yán)格執(zhí)行方式由進(jìn)入的代碼的類型決定。

進(jìn)入全局代碼

 當(dāng)控制流進(jìn)入 全局代碼 的執(zhí)行環(huán)境時(shí),執(zhí)行以下步驟:

  1. 按 10.4.1.1 描述的方案,使用 全局代碼 初始化執(zhí)行環(huán)境。
  2. 按 10.5 描述的方案,使用 全局代碼 執(zhí)行定義綁定初始化步驟。

10.4.1.1 初始化全局執(zhí)行環(huán)境

 以下步驟描述 ECMA 腳本的全局執(zhí)行環(huán)境 C 的創(chuàng)建過程:

  1. 將變量環(huán)境設(shè)置為 全局環(huán)境 。
  2. 將詞法環(huán)境設(shè)置為 全局環(huán)境 。
  3. 將 this 綁定設(shè)置為 全局對象 。

進(jìn)入 eval 代碼

 當(dāng)控制流進(jìn)入 eval 代碼 的執(zhí)行環(huán)境時(shí),執(zhí)行以下步驟:

  1. 如果沒有調(diào)用環(huán)境,或者 eval 代碼 并非通過直接調(diào)用(15.1.2.1.1)eval 函數(shù)進(jìn)行評估的,則按(10.4.1.1)描述的初始化全局執(zhí)行環(huán)境的方案,以 eval 代碼 作為 C 來初始化執(zhí)行環(huán)境。
  2. 否則將 this 綁定設(shè)置為當(dāng)前執(zhí)行環(huán)境下的 this 綁定。將詞法環(huán)境設(shè)置為當(dāng)前執(zhí)行環(huán)境下的 詞法環(huán)境 。將變量環(huán)境設(shè)置為當(dāng)前執(zhí)行環(huán)境下的變量環(huán)境。
  3. 如果 eval 代碼 是 嚴(yán)格模式下的代碼 ,則令 strictVarEnv 為以詞法環(huán)境為參數(shù)調(diào)用 NewDeclarativeEnvironment 得到的結(jié)果。設(shè)置詞法環(huán)境為 strictVarEnv。設(shè)置變量環(huán)境為 strictVarEnv。
  4. 按 10.5 描述的方案,使用 eval 代碼 執(zhí)行定義綁定初始化步驟。

嚴(yán)格模式下的限制

 如果調(diào)用環(huán)境的代碼或 eval 代碼 是 嚴(yán)格模式下的代碼 ,則 eval 代碼不能在調(diào)用環(huán)境的變量環(huán)境中 初始化變量及函數(shù)綁定 。與之相對的,變量及函數(shù)綁定將在一個(gè)新的環(huán)境變量中被初始化,該環(huán)境變量僅可被 eval 代碼 訪問。

進(jìn)入函數(shù)代碼

 當(dāng)控制流根據(jù)一個(gè)函數(shù)對象 F、調(diào)用者提供的 thisArg 以及調(diào)用者提供的 argumentList,進(jìn)入 函數(shù)代碼 的執(zhí)行環(huán)境時(shí),執(zhí)行以下步驟:

  1. 如果 函數(shù)代碼 是 嚴(yán)格模式下的代碼 ,設(shè) this 綁定為 thisArg。
  2. 否則如果 thisArg 是 null 或 undefined,則設(shè) this 綁定為 全局對象 。
  3. 否則如果 Type(thisArg) 的結(jié)果不為 Object,則設(shè) this 綁定為 ToObject(thisArg)。
  4. 否則設(shè) this 綁定為 thisArg。
  5. 以 F 的 [[Scope]] 內(nèi)部屬性為參數(shù)調(diào)用 NewDeclarativeEnvironment,并令 localEnv 為調(diào)用的結(jié)果。
  6. 設(shè)詞法環(huán)境為 localEnv。
  7. 設(shè)變量環(huán)境為 localEnv。
  8. 令 code 為 F 的 [[Code]] 內(nèi)部屬性的值。
  9. 按 [10.5](#10.5) 描述的方案,使用 函數(shù)代碼 code 和 argumentList 執(zhí)行定義綁定初始化步驟。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號