javascript - 为什么它被称为函数表达式而不是函数声明?
问题描述
我开始学习 React,现在我又回到了 JavaScript 中一些更基本的概念。
我已经了解了函数表达式和函数声明之间的区别,但我仍然对为什么函数表达式不称为函数声明感到困惑。
如果这是一个变量声明:
const foo = 5;
那为什么叫函数表达式呢?:
const bar = function() {
// Some code
};
在第二个例子中,不是声明了“const bar”吗?为什么函数表达式和函数声明要这样命名?为什么函数表达式不称为函数声明,反之亦然?
解决方案
有趣的问题。措辞可以有软界限,这部分是造成这种混乱的原因。
首先,一些粗略的定义:
- 表达:我认为这是最好的例子。
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 的主体内定义。换句话说,任何命名函数表达式都在其自身的主体中声明其名称。
推荐阅读
- cordova - Electron Builder Appx 未在 Windows 商店上验证
- r - 如何仅在包含指定字符串作为列名的列中使用 sQuote
- c++ - 如何将 glm::vec3(1.f, 0.f, 0.f) 设置为枚举的值?
- asp.net - Google Cloud Pub/Sub 发布者生命周期
- c# - 使用 C# 客户端将文件上传到 PHP 服务器时没有结果字符串
- ios - Swift中的AVAudioPlayer多次停止问题
- android - Android Robolectric 异常
- html - 在html上添加指向本地文件的链接
- scala - 从可能不存在的插件调用任务
- django - 如何在 django thag 中创建一个搜索栏,根据所采取的选择过滤查询集?