Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数声明可以出现在JavaScript语句中吗? 请将官方ECMAScript规范视为您答案的来源,而不是由特定浏览器供应商发布的文档。(我知道Mozilla用“函数语句”扩展了JavaScript实现。)_Javascript - Fatal编程技术网

函数声明可以出现在JavaScript语句中吗? 请将官方ECMAScript规范视为您答案的来源,而不是由特定浏览器供应商发布的文档。(我知道Mozilla用“函数语句”扩展了JavaScript实现。)

函数声明可以出现在JavaScript语句中吗? 请将官方ECMAScript规范视为您答案的来源,而不是由特定浏览器供应商发布的文档。(我知道Mozilla用“函数语句”扩展了JavaScript实现。),javascript,Javascript,因此,根据ECMAScript规范,因此,其中定义的语法结果,这有效吗? if (foo) { function x() { return; } } 更新:我的问题也可以这样表述:语句生成能否包含函数声明生成 结论:答案是否定的。是的,它是有效的 所有语句块(即大括号内的所有语句)都可以有额外的语句和声明,包括函数 所以你也可以在函数中定义函数等等 这是ECMA-262 v1-我不知道该怎么读,但我想说: 注意:众所周知,ECMAScript的几个广泛使用的实现支持将FunctionD

因此,根据ECMAScript规范,因此,其中定义的语法结果,这有效吗?

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)。他们用英语解释它们 取而代之的是专有方式


不,它是无效的。函数声明只能显示为“源元素”,它们要么在全局范围内,要么就在另一个函数定义之外