假设我在第 1 行声明了一个空函数:
1: function foo () {}
2: foo()
我在第 2 行执行了相同的操作,第 2 行是语句还是表达式,为什么?
function foo () {}
=> 这是一个函数声明。
foo()
=> 您正在调用该函数,这是调用该函数的表达式
第 2 行是包含(并且完全由)调用表达式的语句。如果您没有在语句末尾省略可选的分号,它可能更容易识别为语句:
/* 1 */ function foo () {}
/* 2 */ foo();
// ^
单独的foo()
部分是调用表达式,它也可以在允许表达式的不同上下文中使用,例如作为console.log
in的参数console.log(foo());
。
第2 行的代码是调用表达式(第 12.3.4 节)。
但是,整个第 2 行是一个表达式语句(第 13.5 节)。此处执行自动分号插入(第 11.9 节)以将表达式转换为表达式语句。
函数调用是一个表达式。被调用的函数体中的内容没有区别。实际上,即使定义了函数也没有什么区别(但是如果您在定义函数之前尝试执行调用,则会出错)。
任何表达式也可以用作语句,只需将其单独编写而不是作为其他语句或表达式的一部分。
所以第 2 行既是表达式又是语句。