代码之家  ›  专栏  ›  技术社区  ›  Å ime Vidas Zim84

函数声明可以出现在JavaScript语句中吗?

  •  17
  • Å ime Vidas Zim84  · 技术社区  · 14 年前

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

    if (foo) {
        function x() { return; }
    }
    

    更新: 声明 生产包含 生产?

    答案是不。

    7 回复  |  直到 14 年前
        1
  •  20
  •   Daniel Vassallo    14 年前

    我不同意其他说这是有效的答案。

    根据 ECMA-262 5th Edition specification , Blocks 只能包含 Statements Section 12.1 ):

    Block :
       { StatementList opt }
    
    StatementList :
       Statement
       StatementList  Statement
    

    FunctionDeclaration 以及 FunctionExpression . 规范进一步说明了这一点 Section 12 :

    函数声明 作为一个 Statement FunctionDeclarations . 由于这些不可调和的差异,使用 作为一个 声明 导致代码在实现之间不能可靠地移植。建议ECMAScript实现不允许使用 或者在遇到这种用法时发出警告。未来版本的ECMAScript可以定义替代的可移植方法,用于在 上下文。

    为了进一步阅读,您还可能有兴趣查看 comp.lang.javascript FAQ Section 4.2

    4.2什么是函数语句?

    函数语句一词被广泛错误地用来描述 函数声明 . 这是一种误导,因为在ECMAScript中 函数声明 声明 声明 是允许的,但是 不是。为了增加这种混乱,一些实现,特别是Mozillas,提供了一个称为function statement的语法扩展。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) }
    

    使用函数语句的代码有三种已知的解释。一些实现过程 Fze 作为一个陈述,按顺序。其他,包括JScript,evaluate Fze公司 在进入它出现的执行上下文时。然而,其他人,特别是DMDScript和BESEN的默认配置,抛出了 SyntaxError

    对于跨实现的一致行为,不要使用函数语句;使用 函数表达式 相反。

    FunctionExpression示例(有效):

    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}
    
        2
  •  3
  •   Pekka    14 年前

    我不知道怎么读,但是 ECMA-262 V5 有话要说:

    注意,已知有几种广泛使用的ECMAScript实现支持 FunctionDeclaration

    如果我正确理解这一点,严格地说,这意味着函数声明根本不能在块中,因为块只能包含语句。

    我可以 不过,我的解释有误——我不熟悉ECMAScript的内部工作原理。

        3
  •  3
  •   Community datashaman    7 年前

    不,它是无效的。功能 声明 只能以“源元素”的形式出现,这些元素要么在全局范围内,要么就在其他所有语句之外的另一个函数定义内。来自ECMA-262规范:

    程序:SourceElements

    SourceElement:语句|函数声明

    FunctionDeclaration .

    唯一的功能 表达 允许作为声明的一部分:

    ...

    声明:声明声明

    编辑: 最近就另一个问题进行了相关的讨论。请参阅上的评论 this answer 能够 是有效的,但是语法清楚地表明它是无效的。

        4
  •  2
  •   BGerrissen    14 年前

    From ECMA 262 chapter 14

    程序:SourceElements 源元素源元素 函数声明语义

    制作程序: 跟随:

    1. 处理函数声明的源元素。

    2. 返回结果(2)。

    生产源元素: 函数声明如下:

    1. 处理函数声明的SourceElement。

    SourceElement的计算方法如下:

    1. 返回结果(1)。

    生产源元素: SourceElement SourceElement是 跟随:

    1. 处理函数声明的源元素。

    生产源元素: 评估如下:

    1. 如果结果(1)是突然完成,则返回结果(1)

    2. 计算SourceElement。

    生产源元素: * * 不采取行动的声明。

    * *

    一。评价语句。

    生产源元素: 函数声明如下:

    1. 处理函数声明的函数声明(见第13条)。

    函数声明的计算结果为

    1. 返回(正常、空、空)。

    遮阳篷是正式的没有。(艾姆·维达斯在另一个问题上说服了我)

        5
  •  1
  •   meder omuraliev    14 年前

    ECMA-262的第5版说它不应该是有效的:

    出现在程序或函数体中。 在句法上,它们不能出现在 当或为陈述。这是 语句,而不是SourceElements 函数声明是。如果我们看看 唯一的表达方式是 表达陈述的一部分。然而, 表达式语句是显式的 定义为不以“函数”开头 使FunctionExpression无效为 那块只是 声明)。

    this page :

    因为这些限制, 当函数出现在块中时 实际上应该被认为是一种语法 错误,不是函数声明或 我没见过任何实现 规则(例外情况是 而不是专有的方式。

        6
  •  0
  •   Chuck    14 年前

    某物 合理,尽管实现之间不一致)。

        7
  •  -1
  •   Simon Quentin    14 年前

    是的,它是有效的。

    所有语句块(即大括号内的所有语句块)都可以有其他语句和声明,包括函数。

    所以你也可以在函数中定义函数等等

    http://www.mozilla.org/js/language/E262.pdf