2 回答
TA贡献1784条经验 获得超9个赞
有趣的问题。措辞可能有软边界,这也是造成这种混乱的部分原因。
首先,一些粗略的定义:
表达:我认为最好通过一个例子来思考这一点。
2 * 2
是一个表达式,因为您可以继续对其进行其他操作,例如2 * 2 - 3
.if (...)
另一方面,它不是 javascript 中的表达式,它不会解析为您可以对其进行进一步操作的值。这样做是无效的if (...) {...} / 2
。这个“定义”有一些漏洞,但对于这个答案来说应该足够好了。声明:声明只是声明您将使用某个变量名称。因此,在您的示例中
const foo = 5
,它是const foo
实际声明的部分,= 5
只是初始化声明。
考虑到这一点,让我们考虑两个函数示例,并看看该术语如何在这些示例中发挥作用:
const g = function() {}
这里正在进行一项声明,即const g
. 我们还看到有一个函数被创建并分配给 g。我们正在用结果做某事function() {}
(我们将其分配给某物),这意味着 javascript 会将其解释为函数表达式。
function f() {}
我们没有将此函数用作表达式(在创建它后我们没有对其进行任何其他操作),因此 javascript 实际上会以与我们的第一个示例不同的方式对待它。它将在本地命名空间中声明 f ,并将应用函数提升。如果您只是添加了+
before function f() {}
,那么您会导致 javascript 将其解释为表达式,并且这些功能将被禁用。您可以在开发工具中尝试 - 输入+function f(){}
or const g = function f(){}
, f 将保持未定义状态。
javascript 在不同的上下文中以不同的方式对待 function 关键字这一事实是这种语言选择的核心。您几乎可以将“function”关键字视为具有两种不同的含义,所选择的含义取决于上下文。任何时候函数在表达式上下文中使用或未命名时,它都会采用“表达式”形式,我们将其称为“函数表达式”。否则,它采用包含一些额外功能的替代形式,例如将函数名称声明为局部变量。这可能就是我们将这种替代形式称为函数声明的原因。然而,就像OP正确指出的那样,即使使用const f = function() {}
,声明仍然发生,只是没有通过function
关键字发生。
脚注:对于像这样的示例+function f(
) {}
,f 不会在与 g 相同的范围内定义,但它确实在 f 体内定义。换句话说,任何命名函数表达式都在其自己的主体内声明其名称。
TA贡献1877条经验 获得超6个赞
那为什么叫函数表达式呢?:
给变量赋值,实际上就是一个表达式。在你的例子中foo = 5,这是一个表达式。你也在声明foo,但它仍然是一个表达式。
类似地,另一个示例const bar = function() {}称为函数表达式,以区分函数声明和函数表达式。
函数表达式
const bar = function() {
// Some code
};
与函数声明
function foo() {
// Some code
};
添加回答
举报