首页 > 解决方案 > 为什么它被称为函数表达式而不是函数声明?

问题描述

我开始学习 React,现在我又回到了 JavaScript 中一些更基本的概念。

我已经了解了函数表达式和函数声明之间的区别,但我仍然对为什么函数表达式不称为函数声明感到困惑。

如果这是一个变量声明

const foo = 5;

那为什么叫函数表达式呢?:

const bar = function() {
    // Some code
};

在第二个例子中,不是声明了“const bar”吗?为什么函数表达式和函数声明要这样命名?为什么函数表达式不称为函数声明,反之亦然?

标签: javascriptvariablesexpression

解决方案


有趣的问题。措辞可以有软界限,这部分是造成这种混乱的原因。

首先,一些粗略的定义:

  • 表达:我认为这是最好的例子。2 * 2是一个表达式,因为您可以继续对其进行其他操作,例如2 * 2 - 3. if (...)另一方面,它不是 javascript 中的表达式,它不会解析为您可以对其进行进一步操作的值。这样做是无效的if (...) {...} / 2。这个“定义”有一些漏洞,但对于这个答案来说应该足够好。
  • 声明:声明只是声明您将使用某个变量名。因此,在您的示例中const foo = 5,它const foo是实际声明的部分,= 5只是初始化声明。

考虑到这一点,让我们考虑两个函数示例,看看这个术语如何在这些示例中发挥作用:

  1. const g = function() {}

这里有一个声明,const g. 我们还看到有一个函数正在创建并分配给 g。我们正在使用function() {}(我们将其分配给某物)的结果做某事,这意味着 javascript 会将其解释为函数表达式。

  1. 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 的主体内定义。换句话说,任何命名函数表达式都在其自身的主体中声明其名称。


推荐阅读