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