我正在查看section 13或ECMAScript規範(v。5)。如下初始化匿名函數表達式:爲什麼匿名函數表達式和命名函數表達式初始化如此不同?
返回按照13.2中的規定,使用由FunctionBody指定的由FormalParameterListopt和Body指定的參數創建一個新的Function對象的結果。作爲範圍傳遞正在運行的執行上下文的LexicalEnvironment。如果FunctionExpression包含在嚴格代碼中或者其FunctionBody是嚴格代碼,則傳入true作爲Strict標誌。
這個邏輯是很類似於如何初始化函數聲明。但是,請注意命名函數表達式的不同初始化方式。
- 令funcEnv是調用NewDeclarativeEnvironment傳遞運行的執行上下文的詞法環境作爲 論證的結果
- 令envRec funcEnv的環境記錄。
- 調用envRec的CreateImmutableBinding具體方法,傳遞Identifier的String值作爲參數。
- 讓閉包是根據13.2中的規定創建一個新的Function對象的結果,其參數由FormalParameterListopt 指定,並由FunctionBody指定。作爲範圍傳遞funcEnv。如果函數表達式包含在 嚴格代碼中,或者其FunctionBody是嚴格代碼,則將 作爲嚴格標記。
- 調用envRec的InitializeImmutableBinding具體方法,傳遞Identifier和closure的String值作爲參數。
- 退貨關閉。
我知道的名爲/匿名函數表達式之間的巨大差異之一就是有名函數表達式可以遞歸從函數中調用,但是這是所有我能想到的。爲什麼設置如此不同以及爲什麼需要執行這些額外的步驟?
還有其他的微妙之處。函數表達式名稱綁定是隻讀的,但您仍然可以在函數表達式的主體中聲明一個使用相同名稱的var或函數。描述這種語義(記住這只是一個規範)需要使用額外的環境記錄。 – 2013-03-01 20:05:02
有趣。但爲什麼這需要額外的環境記錄?例如,如果NFE的標識符綁定是在第5步之前的函數聲明(10.5)期間創建的,則源代碼中的任何var/function聲明只會覆蓋NFE的綁定(5f)而不是將其隱藏。幾乎相同的效果,不是嗎? – kangax 2013-03-01 20:52:51