为了账号安全,请及时绑定邮箱和手机立即绑定

为什么叫函数表达式而不是函数声明呢?

为什么叫函数表达式而不是函数声明呢?

阿波罗的战车 2023-08-10 15:59:34
我开始学习 React,现在我又回到了 JavaScript 中的一些更基本的概念。我已经了解了函数表达式和函数声明之间的区别,但仍然困惑我为什么函数表达式不称为函数声明。如果这是一个变量声明:const foo = 5;那为什么这叫函数表达式呢?:const bar = function() {    // Some code};在第二个例子中,不是声明了“const bar”吗?为什么函数表达式和函数声明如此命名?为什么函数表达式不称为函数声明,反之亦然?
查看完整描述

2 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

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

首先,一些粗略的定义:

  • 表达:我认为最好通过一个例子来思考这一点。2 * 2是一个表达式,因为您可以继续对其进行其他操作,例如2 * 2 - 3if (...)另一方面,它不是 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 体内定义。换句话说,任何命名函数表达式都在其自己的主体内声明其名称。


查看完整回答
反对 回复 2023-08-10
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

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


给变量赋值,实际上就是一个表达式。在你的例子中foo = 5,这是一个表达式。你也在声明foo,但它仍然是一个表达式。


类似地,另一个示例const bar = function() {}称为函数表达式,以区分函数声明和函数表达式。


函数表达式


const bar = function() {

    // Some code

};

与函数声明


function foo() {

    // Some code

};


查看完整回答
反对 回复 2023-08-10
  • 2 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信