2013-02-22 45 views
5

我正在閱讀ECMA 262 5 specification的執行上下文/詞彙環境部分。它指出了以下內容:(強調增加)函數表達式是否有其自己的作用域/詞法環境

詞法環境是一種規範類型,用於基於ECMAScript代碼的詞法嵌套結構來定義標識符與特定變量和函數的關聯。詞法環境由一個環境記錄和一個可能爲空的外部詞法環境引用組成。通常,詞法環境與某些ECMAScript代碼的特定語法結構相關聯,例如函數聲明,WithStatement或TryStatement的Catch子句,並且每次評估此類代碼時都會創建一個新的詞法環境。

我注意到它沒有提到爲函數表達式創建一個詞法環境。是爲函數表達式創建的詞法環境,還是僅爲函數聲明創建的環境?我錯過了什麼嗎?

編輯:我注意到,功能碼將有its own execution context,這就是爲什麼我也困惑,爲什麼函數表達式沒有在詞法環境一節中提到。

+4

因爲例子列表以「such as」開頭,所以我不認爲它是詳盡無遺的。 – Pointy 2013-02-22 22:41:11

+0

[第13節](http://www.ecma-international.org/ecma-262/5.1/#sec-13)似乎表明,僅爲具有名稱的函數表達式創建新的詞彙環境(而不是爲匿名函數表達式或函數聲明)。但我必須錯誤地解​​釋它。 – 2013-02-22 23:06:33

回答

3

是,函數獲得(§10.4.3 )當它被調用時它自己的ExecutionContext§13.2.1)。該新的上下文使用新的LexicalEnvironment(由NewDeclarativeEnvironment,§10.2.2.2創建)初始化,從[[Scope]]導出的函數 - 即LexicalEnvironment它在(§13)中被聲明/「表達」。

正如@Pointy所指出的那樣,您捏造的句子並沒有詳盡地列出它們:「...某些[結構],如......」。

2

實例化函數有一個範圍。它是否作爲函數聲明語句或函數實例化表達式的一部分被實例化並不重要。

(這可能是更正確的說,實例化的函數有一個範圍當它被稱爲,而且每次調用產生不同範圍。)

3

如果名稱包含在函數表達式中,那麼該名稱將成爲只讀綁定,該函數將會影響具有相同名稱的任何外部聲明。但是這種綁定本身可能被函數內的形式參數或局部聲明所遮蔽。功能名稱的這種綁定僅針對名爲FunctionExpressions而不是匿名FunctionExpressions函數聲明創建。在周圍的變量環境中創建綁定函數聲明的名稱。

這裏是一個更詳細的explantion引用ES5.1規範:

有一個函數對象相關聯的一個以上的環境記錄。每當調用函數時,都會創建一個新的DeclarativeEnvironmentRecord以包含該特定函數調用的本地綁定。該記錄既成爲變量環境又成爲爲該調用創建的ExecutionContext的最初LexicalEnvironment。這在第10.4.3節中有規定。

創建此環境記錄時,其「外部環境」設置爲正在調用的函數對象的[[Scope]]內部屬性的值。 (第5行,第10.4.3節)外部環境爲所有非本地聲明提供綁定。 [[Scope]]在創建函數對象時設置(請參閱第13節和13.2中的語義)。因此,每個特定函數對象的不同調用具有不同的本地環境,但該函數的所有調用共享相同的外部[[Scope]]。

對於大多數函數,捕獲的[[Scope]]只是創建函數時處於活動狀態的ExecutionContext的LexicalEnvironment。但是函數表達式包含一個標識符,因爲函數名在其[[Scope]]鏈的頭部有一個額外的DeclarativeEnvironmentRecord插入。 (請參閱第13節中第三個算法的步驟1-3)。

這個額外的環境記錄用於捕獲FunctionExpression中給出的函數名稱的綁定。

相關問題