【发布时间】:2016-04-23 18:36:35
【问题描述】:
当您查看 ECMAScript 6 specification 时,我发现了一些有趣的东西。
13 函数定义
语法
FunctionDeclaration : function Identifier ( FormalParameterListopt ) { FunctionBody }
FunctionExpression : function Identifieropt (FormalParameterListopt ) { FunctionBody }
这两种不同的声明类型进一步细分为以下语义定义:
产生式
FunctionExpression : function ( FormalParameterListopt ) { FunctionBody }评估如下:返回创建新
Function对象的结果,如 13.2 参数由FormalParameterListopt指定,正文由FunctionBody指定。传入LexicalEnvironment的 运行执行上下文作为范围。传入true作为Strictflag 如果FunctionExpression包含在strict代码中 或者如果它的FunctionBody是strict代码。
还有:
产生式
FunctionDeclaration : function Identifier ( FormalParameterListopt ) { FunctionBody }实例化如下 在声明绑定实例化期间(10.5):返回创建新
Function对象的结果,如 13.2 参数由FormalParameterListopt指定,正文由FunctionBody指定。传入VariableEnvironment的 运行执行上下文作为范围。以Strict的形式传入 true 如果FunctionDeclaration包含在strict代码中,或者如果 它的FunctionBody是strict代码。
我将其解释为声明是否正确
function foo(){};
被定义为本质上在“函数表”中声明,其中所有参数和变量在加载执行上下文时分配在堆栈上,而
function (){};
在它被解析执行的那一刻之前基本上不存在,它的所有变量和范围都继承自相关的本地执行上下文?
或者用外行的话来说,命名声明是预先分配的,而匿名声明是在“运行时”分配的?
【问题讨论】: