为什么函数声明不是变量声明时的声明

时间:2014-06-10 17:33:29

标签: javascript

这似乎是一个愚蠢的问题,但我真的无法绕过它。当我想到为什么在变量声明之后有分号而不是函数声明时,我开始怀疑这一点。那么这是否意味着函数声明是一个表达式?

声明的官方含义是什么?我一直在找答案,说一个语句是一个“命令”,告诉计算机该做什么,但不是一个函数声明告诉计算机该怎么做?它是否与执行代码时加载时有关?

2 个答案:

答案 0 :(得分:2)

变量声明可能有副作用(例如var x = alert(42);)。

函数声明不能​​。

答案 1 :(得分:1)

  

当我想到为什么在变量声明之后有分号而不是函数声明时,我开始怀疑这个

Not every statement ends with a semicolon

带分号后缀的语句示例:

  • 变量声明:var foo = <expression>;
  • 表达式声明:<expression>;
  • while while循环:do <statement> while (<expression>);

不带分号的示例:

  • 如果声明:if (<expression>) <statement>
  • 尝试使用catch语句:try <block> catch (<identifier>) <block>
  • For loop:for (...) <statement>
  • 阻止声明:{ <statement list> }
  

那么这是否意味着函数声明是一个表达式?

不,它比那更复杂。函数声明是不是语句。它们也不是表达式,它们是source elements。语句和函数声明都是源元素。的 **


  

声明的官方含义是什么?

我无法告诉你官方的定义,但在JS的背景下,我会说类似于&#34;它是一条不会产生可指定结果/值的指令&#34;。另一方面,表达式产生的结果可用于其他表达式。


** 很高兴知道,但有点偏离主题:由于函数声明不是语句,因此技术上不允许在块内使用它们。如果我们还考虑提升,这一点就更加明显了。这个例子应该在每个浏览器中抛出语法错误,但不幸的是它没有。

if (true) {
  function foo() { alert('foo'); }
} else {
  function foo() { alert('bar'); }
}
foo();

这导致不同浏览器中的不同行为。 Chrome会显示bar,但Firefox会显示foo。 Chrome只提升两个功能声明,第二个覆盖第一个。 Firefox将这两个声明解释为函数表达式

Try it yourself在不同的浏览器中。