定義綁定初始化

2018-06-16 15:16 更新

每個執(zhí)行環(huán)境都有一個關(guān)聯(lián)的變量環(huán)境。當在一個執(zhí)行環(huán)境下評估一段 ECMA 腳本時,變量和函數(shù)定義會以綁定的形式添加到這個變量環(huán)境的 環(huán)境記錄 中。對于函數(shù) 函數(shù)代碼,參數(shù)也同樣會以綁定的形式添加到這個變量環(huán)境的 環(huán)境記錄 中。

 選擇使用哪一個、哪一類型的 環(huán)境記錄 來綁定定義,是由執(zhí)行環(huán)境下執(zhí)行的 ECMA 腳本的類型決定的,而其它部分的邏輯是相同的。當進入一個執(zhí)行環(huán)境時,會按以下步驟在變量環(huán)境上創(chuàng)建綁定,其中使用到調(diào)用者提供的代碼設(shè)為 code,如果執(zhí)行的是 函數(shù)代碼 ,則設(shè) 參數(shù)列表 為 args:

  1. 令 env 為當前運行的執(zhí)行環(huán)境的環(huán)境變量的 環(huán)境記錄 。
  2. 如果 code 是 eval 代碼 ,則令 configurableBindings 為 true,否則令 configurableBindings 為 false。
  3. 如果代碼是 嚴格模式下的代碼 ,則令 strict 為 true,否則令 strict 為 false。
  4. 如果代碼為 函數(shù)代碼 ,則:令 func 為通過 [[Call]] 內(nèi)部屬性初始化 code 的執(zhí)行的函數(shù)對象。令 names 為 func 的 [[FormalParameters]] 內(nèi)部屬性。令 argCount 為 args 中元素的數(shù)量。令 n 為數(shù)字類型,其值為 0。按列表順序遍歷 names,對于每一個字符串 argName:令 n 的值為 n 當前值加 1。如果 n 大于 argCount,則令 v 為 undefined,否則令 v 為 args 中的第 n 個元素。以 argName 為參數(shù),調(diào)用 env 的 HasBinding 具體方法,并令 argAlreadyDeclared 為調(diào)用的結(jié)果。如果 argAlreadyDeclared 的值為 false,以 argName 為參數(shù)調(diào)用 env 的 CreateMutableBinding 具體方法。以 argName、v 和 strict 為參數(shù),調(diào)用 env 的 SetMutableBinding 具體方法。
  5. 按源碼順序遍歷 code,對于每一個 FunctionDeclaration 表達式 f:令 fn 為 FunctionDeclaration 表達式 f 中的 標識符 。按 第 13 章 中所述的步驟初始化 FunctionDeclaration 表達式 ,并令 fo 為初始化的結(jié)果。以 fn 為參數(shù),調(diào)用 env 的 HasBinding 具體方法,并令 argAlreadyDeclared 為調(diào)用的結(jié)果。如果 argAlreadyDeclared 的值為 false,以 fn 和 configurableBindings 為參數(shù)調(diào)用 env 的 CreateMutableBinding 具體方法。否則如果 env 是全局環(huán)境的 環(huán)境記錄 對象,則:令 go 為全局對象。以 fn 為參數(shù),調(diào)用 go 和 [[GetProperty]] 內(nèi)部方法,并令 existingProp 為調(diào)用的結(jié)果。如果 existingProp.[[Configurable]] 的值為 true,則:以 fn、由 {[[Value]]: undefined, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: configurableBindings } 組成的 屬性描述符 和 true 為參數(shù),調(diào)用go 的 [[DefineOwnProperty]] 內(nèi)部方法。否則如果 IsAccessorDescrptor(existingProp) 的結(jié)果為真,或 existingProp 的特性中沒有 {[[Writable]]: true, [[Enumerable]]: true},則:拋出一個 TypeError 異常。以 fn、fo 和 strict 為參數(shù),調(diào)用 env 的 SetMutableBinding 具體方法。
  6. 以 arguments 為參數(shù),調(diào)用 env 的 HasBinding 具體方法,并令 argumentsAlreadyDeclared 為調(diào)用的結(jié)果。
  7. 如果 code 是 函數(shù)代碼 ,并且 argumentsAlreadyDeclared 為 false,則:以 fn、names、args、env 和 strict 為參數(shù),調(diào)用 CreateArgumentsObject 抽象運算函數(shù),并令 argsObj 為調(diào)用的結(jié)果。如果 strict 為 true,則:以字符串 "arguments" 為參數(shù),調(diào)用 env 的 CreateImmutableBinding 具體方法。以字符串 "arguments" 和 argsObj 為參數(shù),調(diào)用 env 的 InitializeImmutableBinding 具體函數(shù)。否則:以字符串 "arguments" 為參數(shù),調(diào)用 env 的 CreateMutableBinding 具體方法。以字符串 "arguments"、argsObj 和 false 為參數(shù),調(diào)用 env 的 SetMutableBinding 具體函數(shù)。
  8. 按源碼順序遍歷 code,對于每一個 VariableDeclaration 和 VariableDeclarationNoIn 表達式:令 dn 為 d 中的標識符。以 dn 為參數(shù),調(diào)用 env 的 HasBinding 具體方法,并令 varAlreadyDeclared 為調(diào)用的結(jié)果。如果 varAlreadyDeclared 為 false,則:以 dn 和 configurableBindings 為參數(shù),調(diào)用 env 的 CreateMutableBinding 具體方法。以 dn、undefined 和 strict 為參數(shù),調(diào)用 env 的 SetMutableBinding 具體方法。


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號