这似乎是一个愚蠢的问题,但我真的无法绕过它。当我想到为什么在变量声明之后有分号而不是函数声明时,我开始怀疑这一点。那么这是否意味着函数声明是一个表达式?
声明的官方含义是什么?我一直在找答案,说一个语句是一个“命令”,告诉计算机该做什么,但不是一个函数声明告诉计算机该怎么做?它是否与执行代码时加载时有关?
答案 0 :(得分:2)
变量声明可能有副作用(例如var x = alert(42);
)。
函数声明不能。
答案 1 :(得分:1)
当我想到为什么在变量声明之后有分号而不是函数声明时,我开始怀疑这个
Not every statement ends with a semicolon
带分号后缀的语句示例:
var foo = <expression>;
<expression>;
do <statement> while (<expression>);
不带分号的示例:
if (<expression>) <statement>
try <block> catch (<identifier>) <block>
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在不同的浏览器中。