为什么 JavaScript 会提升变量?

IT技术 javascript hoisting
2021-01-17 00:30:21

为什么 JavaScript 会提升变量?

设计师在决定实施吊装时的基本原理是什么?有没有其他流行的语言可以做到这一点?

请提供文件和/或记录的相关链接。

3个回答

正如 Stoyan Stefanov 在“JavaScript Patterns”一书中解释的那样,提升是 JavaScript 解释器实现的结果。

JS 代码解释分两遍执行。在第一遍期间,解释器处理变量和函数声明。

第二遍是实际的代码执行步骤。解释器处理函数表达式和未声明的变量。

因此,我们可以使用“提升”的概念来描述这种行为。

呃,这并没有真正解释原因。单通道解释器(不会导致提升)会简单得多 - 那么为什么设计师选择两次通道?
2021-03-30 00:30:21
我个人真的不喜欢“提升”这个词。它给出了错误的表示,变量和函数声明被神奇地提升到当前作用域的顶部,而实际上,正如您提到的,JS 解释器扫描源代码以获取绑定,然后执行代码。
2021-04-04 00:30:21
Josh M. 这是如此广泛的指定,我不认为这是一个“错误”......(我同意这个答案并没有真正回答推理)
2021-04-05 00:30:21
这并不能解释为什么变量,特别是被提升。函数有意义,变量没有意义(在大多数情况下)——我相信这是一个错误。
2021-04-08 00:30:21
现在我明白了为什么 JS 是最容易被误解的语言,我在任何教程中都没有看到这一点。并与提升(和解释器流程)混淆。
2021-04-13 00:30:21

JS 创建者 Brendan Eich曾经说过(在 Twitter 上)

“因此,var 提升是函数提升的 [一个] 意外结果,没有块作用域,[和] JS 作为 1995 年的紧急工作。”

他还解释说……

“函数提升允许自上而下的程序分解,'let rec' 免费,在声明之前调用;var 提升标记在一起。”

布伦丹·艾希

有没有其他流行的语言可以做到这一点?

我不知道有任何其他流行的语言以相同的方式提升变量。我认为即使是 ActionScript——另一个用于 Flash 开发的 ECMAScript 实现——也没有实现提升。对于熟悉其他语言的正在学习 JavaScript 的开发人员来说,这一直是一个困惑和沮丧的根源。

另一种具有变量提升的流行语言是 Python:stackoverflow.com/q/63337235/2326961
2021-03-25 00:30:21
谢谢你的回答。我完全同意@Damon!
2021-03-29 00:30:21
给+1,因为这是试图直接解决问题的唯一答案。
2021-04-04 00:30:21
不正确。Python 没有变量提升。参见:discuss.python.org/t/...
2021-04-13 00:30:21

这是因为 javascript 解释器在两个周期内解释代码。

  1. 代码完成/编译:
  2. 代码执行:

在第 1 个循环中,所有变量和函数声明都被带到它正在执行的函数范围的顶部。这有助于在函数执行之前创建variableObjectsfor execution contextof 函数。

在第二阶段,赋值、代码语句和函数调用以预期的方式逐行进行。

你有更详细的阅读在 这里。

它将让您更好地了解let,constclass声明周围的行为以及它在变量和函数之间遵循的优先级。

您是在暗示这是设计选择的结果吗?如果是这样,您应该在答案中明确说明。但是阅读 Brendan Eich 的回答,它可能是一个想要的功能,这取决于您如何解释最后一句话。最重要的是,我仍然不知道为什么
2021-03-15 00:30:21