这行是否包含函数声明?

时间:2015-04-08 17:43:13

标签: javascript

以下行在JavaScript中称为函数表达式。它是否包含函数声明?

var foo = function() {};

编辑:为清晰起见而编辑。

3 个答案:

答案 0 :(得分:3)

不,它没有。函数表达式和函数声明都定义了函数,并包含function关键字。

它们的区别基本上取决于它们出现在源代码中的位置,它们的语法相同。它是

  • 函数表达式当出现在需要表达式的位置时,例如在分组运算符或赋值表达式中(如在代码中)
  • 函数声明,它直接出现在函数,模块,脚本(全局代码)或eval代码的主体中。从ES6开始,声明也可以作为StatementList的一部分出现,即在块内。
  • 函数语句出现在需要语句的位置时。在ES6之前,当函数语法出现在块中时,该术语用于将其与声明区分开来。如果不在块内,它基本上等同于声明。

另请阅读http://kangax.github.io/nfe/解释所有这些术语(虽然ES6之前)。

对于评估之间的差异,请参阅var functionName = function() {} vs function functionName() {}

答案 1 :(得分:3)

我们可以很容易地确定这不是函数声明, 根据{{​​3}}:

  
      
  • 计划

         
        
    • SourceElements <子>选择
    •   
  •   
  • SourceElements

         
        
    • SourceElement
    •   
    • SourceElements SourceElement
    •   
  •   
  • SourceElement

         
        
    • 声明
    •   
    • FunctionDeclaration
    •   
  •   

FunctionDeclaration 只能是 SourceElement (快速搜索 FunctionDeclaration 显示没有其他语法用法)和 SourceElement 只能是 SourceElements 列表的顶级组件( Program FunctionBody )。 function的使用嵌套在赋值内,因此它不能是顶级 SourceElement

此外,我们还可以通过ES5 section 14将其排除为 FunctionDeclaration

  
      
  • FunctionDeclaration

         
        
    • function 标识符 ( FormalParameterList opt ) { FunctionBody }
    •   
  •   

您的代码没有标识符,这对 FunctionDefinitions 是必需的(但 FunctionExpressions 是可选的。)

答案 2 :(得分:1)

函数表达式定义函数但不声明函数。就像这样的代码

var foo = function() {};

定义一个函数,然后将其赋值给变量。

在哪里

function foo() {};

定义一个函数并声明它而不需要赋值。