我正在查看第 13 节或 ECMAScript 规范 (v. 5)。匿名函数表达式初始化如下:
返回创建一个新的函数对象的结果,如 13.2 中指定的,参数由 FormalParameterListopt 指定,主体由 FunctionBody 指定。传入正在运行的执行上下文的 LexicalEnvironment 作为 Scope。如果 FunctionExpression 包含在严格代码中或其 FunctionBody 是严格代码,则传入 true 作为 Strict 标志。
这个逻辑与函数声明的初始化方式非常相似。但是,请注意命名函数表达式的初始化有多么不同。
- 让 funcEnv 成为调用 NewDeclarativeEnvironment 的结果,传递运行执行上下文的词法环境作为参数
- 设 envRec 为 funcEnv 的环境记录。
- 调用 envRec 的 CreateImmutableBinding 具体方法,传入 Identifier 的 String 值作为参数。
- 让闭包是创建一个新的函数对象的结果,如 13.2 中指定的,其参数由 FormalParameterListopt 指定,主体由 FunctionBody 指定。传入 funcEnv 作为 Scope。如果 FunctionExpression 包含在严格代码中或其 FunctionBody 是严格代码,则传入 true 作为 Strict 标志。
- 调用 envRec 的 InitializeImmutableBinding 具体方法,传递 Identifier 的 String 值和闭包作为参数。
- 返回关闭。
我知道命名/匿名函数表达式之间的一大区别是命名函数表达式可以从函数内部递归调用,但这就是我能想到的。为什么设置如此不同,为什么需要执行这些额外步骤?