May function declarations appear inside statements in JavaScript?

后端 未结 7 1330
暖寄归人
暖寄归人 2020-11-29 04:34

Please consider the official ECMAScript specification as the source for your answer, and not a document published by a specific browser vendor. (I am aware of Mozilla extend

7条回答
  •  自闭症患者
    2020-11-29 05:10

    I do not agree with the other answers that say it is valid.

    According to the ECMA-262 5th Edition specification, Blocks can only contain Statements (Section 12.1):

    Block :
       { StatementList opt }
    
    StatementList :
       Statement
       StatementList  Statement
    

    However the spec does not define a function statement, but only a FunctionDeclaration and a FunctionExpression. The spec goes further to make a note on this in Section 12:

    Several widely used implementations of ECMAScript are known to support the use of FunctionDeclaration as a Statement. However there are significant and irreconcilable variations among the implementations in the semantics applied to such FunctionDeclarations. Because of these irreconcilable difference, the use of a FunctionDeclaration as a Statement results in code that is not reliably portable among implementations. It is recommended that ECMAScript implementations either disallow this usage of FunctionDeclaration or issue a warning when such a usage is encountered. Future editions of ECMAScript may define alternative portable means for declaring functions in a Statement context.

    For further reading, you may also be interested in checking out the comp.lang.javascript FAQ Section 4.2:

    4.2 What is a function statement?

    The term function statement has been widely and wrongly used to describe a FunctionDeclaration. This is misleading because in ECMAScript, a FunctionDeclaration is not a Statement; there are places in a program where a Statement is permitted but a FunctionDeclaration is not. To add to this confusion, some implementations, notably Mozillas', provide a syntax extension called function statement. This is allowed under section 16 of ECMA-262, Editions 3 and 5.

    Example of nonstandard function statement:

    // 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) }
    

    Code that uses function statement has three known interpretations. Some implementations process Fze as a Statement, in order. Others, including JScript, evaluate Fze upon entering the execution context that it appears in. Yet others, notably DMDScript and default configuration of BESEN, throw a SyntaxError.

    For consistent behavior across implementations, do not use function statement; use either FunctionExpression or FunctionDeclaration instead.

    Example of FunctionExpression (valid):

    var Fze;
    try {
      Fze = function(b,a){return b.unselectable=a};
      /*...*/
    } catch(e) { _DumpException(e) }
    

    Example of FunctionDeclaration (valid):

    // Program code
    function aa(b,a){return b.unselectable=a}
    

提交回复
热议问题