函数声明可以出现在JavaScript语句中吗? 请将官方ECMAScript规范视为您答案的来源,而不是由特定浏览器供应商发布的文档。(我知道Mozilla用“函数语句”扩展了JavaScript实现。)
因此,根据ECMAScript规范,因此,其中定义的语法结果,这有效吗?函数声明可以出现在JavaScript语句中吗? 请将官方ECMAScript规范视为您答案的来源,而不是由特定浏览器供应商发布的文档。(我知道Mozilla用“函数语句”扩展了JavaScript实现。),javascript,Javascript,因此,根据ECMAScript规范,因此,其中定义的语法结果,这有效吗? if (foo) { function x() { return; } } 更新:我的问题也可以这样表述:语句生成能否包含函数声明生成 结论:答案是否定的。是的,它是有效的 所有语句块(即大括号内的所有语句)都可以有额外的语句和声明,包括函数 所以你也可以在函数中定义函数等等 这是ECMA-262 v1-我不知道该怎么读,但我想说: 注意:众所周知,ECMAScript的几个广泛使用的实现支持将FunctionD
if (foo) {
function x() { return; }
}
更新:我的问题也可以这样表述:语句生成能否包含函数声明生成
结论:答案是否定的。是的,它是有效的
所有语句块(即大括号内的所有语句)都可以有额外的语句和声明,包括函数
所以你也可以在函数中定义函数等等
这是ECMA-262 v1-我不知道该怎么读,但我想说: 注意:众所周知,ECMAScript的几个广泛使用的实现支持将
FunctionDeclaration
用作语句。然而,在应用于此类函数声明的语义中,实现之间存在着显著的、不可调和的差异。由于这些不可调和的差异,将FunctionDeclaration用作语句会导致代码在实现之间无法可靠地移植。建议ECMAScript实现禁止使用FunctionDeclaration,或者在遇到此类用法时发出警告。ECMAScript的未来版本可能会定义在语句上下文中声明函数的替代可移植方法
如果我理解正确,严格地说,这意味着函数声明根本不能在块内,因为块只能包含语句
不过,我的解释可能完全错误——我不熟悉ECMAScript的内部工作原理 我不同意其他说它有效的答案 根据,
块
只能包含语句
():
但是,规范没有定义函数语句,只定义了FunctionDeclaration
和FunctionExpression
。本规范进一步说明了以下内容:
众所周知,ECMAScript的几种广泛使用的实现支持将函数声明
用作语句
。然而,在应用于此类函数声明的语义中,实现之间存在着显著且不可调和的差异。由于这些不可调和的差异,将函数声明
用作语句
会导致代码在实现之间无法可靠移植。建议ECMAScript实现禁止使用FunctionDeclaration
,或者在遇到此类用法时发出警告。ECMAScript的未来版本可能会定义在语句
上下文中声明函数的替代可移植方法
如需进一步阅读,您还可能有兴趣查看:
4.2什么是函数语句?
if (foo) {
function x() { return; }
}
术语function语句被广泛错误地用于描述函数声明
。这是误导性的,因为在ECMAScript中,FunctionDeclaration
不是语句
;程序中有些地方允许使用语句
,但不允许使用函数声明
。为了增加这种混乱,一些实现,特别是Mozillas,提供了一个称为function语句的语法扩展。ECMA-262第3版和第5版第16节允许这样做
非标准函数语句示例:
// Nonstandard syntax, found in GMail source code. DO NOT USE.
try {
// FunctionDeclaration not allowed in Block.
function Fze(b,a){return b.unselectable=a}
/*...*/
} catch(e) { _DumpException(e) }
var Fze;
try {
Fze = function(b,a){return b.unselectable=a};
/*...*/
} catch(e) { _DumpException(e) }
// Program code
function aa(b,a){return b.unselectable=a}
使用函数语句的代码有三种已知的解释。一些实现将Fze
作为语句按顺序处理。其他脚本,包括JScript,在输入它出现在的执行上下文时对其进行评估。还有一些,特别是DMDScript和BESEN的默认配置,抛出了一个语法错误
对于跨实现的一致行为,不要使用function语句;改用FunctionExpression
或FunctionDeclaration
函数表达式示例(有效):
// Nonstandard syntax, found in GMail source code. DO NOT USE.
try {
// FunctionDeclaration not allowed in Block.
function Fze(b,a){return b.unselectable=a}
/*...*/
} catch(e) { _DumpException(e) }
var Fze;
try {
Fze = function(b,a){return b.unselectable=a};
/*...*/
} catch(e) { _DumpException(e) }
// Program code
function aa(b,a){return b.unselectable=a}
函数声明示例(有效):
// Nonstandard syntax, found in GMail source code. DO NOT USE.
try {
// FunctionDeclaration not allowed in Block.
function Fze(b,a){return b.unselectable=a}
/*...*/
} catch(e) { _DumpException(e) }
var Fze;
try {
Fze = function(b,a){return b.unselectable=a};
/*...*/
} catch(e) { _DumpException(e) }
// Program code
function aa(b,a){return b.unselectable=a}
ECMA-262的第5版说它不应该是有效的:
只允许函数声明
出现在程序或函数体中。
从语法上讲,它们不能出现在
块({…})-例如if的块,
while或for语句。这是
因为块只能包含
语句,而不是SourceElements
功能声明是。如果我们看
仔细看生产规则,我们可以看到
这是表达的唯一方式
块内允许的是
表达陈述的一部分。然而,
表达陈述是明确的
定义为不以“函数”开头
关键字,而这正是
将FunctionExpression设置为无效
语句或块的一部分(注
那个区块只是一个列表
声明)
然而,似乎没有多少口译员遵守这一规则。Kangax说,根据以下内容,这些错误应被视为语法错误:
由于这些限制,,
每当函数出现在块中时
(如前一个例子)它
实际上应该被视为一种语法
错误,不是函数声明或
表情。问题是几乎
我没有见过任何一个实现
严格按照
规则(例外情况为BESEN和
DMDScript)。他们用英语解释它们
取而代之的是专有方式
不,它是无效的。函数声明只能显示为“源元素”,它们要么在全局范围内,要么就在另一个函数定义之外