【问题标题】:Why does JavaScript hoist variables?为什么 JavaScript 会提升变量?
【发布时间】:2021-12-23 23:32:03
【问题描述】:

为什么 JavaScript 会提升变量?

设计师决定实施吊装的原因是什么? 还有其他流行的语言可以做到这一点吗?

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

【问题讨论】:

  • 我怀疑 这个点是历史性的,我严重怀疑它最初不是“易于实施”。
  • 老实说,问问 Brendan Eich,他似乎反应灵敏。
  • 这个问题没有有建设性吗?
  • @Francisc 欢迎来到 Stack Overflow,在这里您可以询问的只是在 jQuery 中移动 div
  • 这是一个非常重要的问题。它应该被允许。这不是火焰诱饵。提升是理解 JavaScript 工作原理的核心要素之一,而“为什么”是该语言的大多数教科书处理方法中解决的合理问题。 Stack Overflow 的人总是在这样的问题上跺脚是不对的。

标签: javascript hoisting


【解决方案1】:

JS 创建者 Brendan Eich once said (on Twitter):

“因此,var 提升是函数提升、没有块范围、[和] JS 作为 1995 年的紧急工作的 [an] 意外结果。”

他还解释说……

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

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

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

【讨论】:

【解决方案2】:

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

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

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

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

【讨论】:

  • 我个人真的不喜欢“吊装”这个词。它给出了变量和函数声明被神奇地提升到当前作用域顶部的错误表示,而实际上,正如您提到的,JS 解释器扫描绑定的源代码并 then 执行代码。
  • 现在我明白了为什么 JS 最容易被误解的语言,我在任何教程中都没有看到这一点。并且对提升(和解释器流程)感到困惑。
  • 呃,这并不能真正解释原因。单通道解释器(不会导致提升)会简单得多 - 那么为什么设计师选择两次通道呢?
  • 这并没有解释为什么变量,特别是被提升。函数有意义,变量没有意义(在大多数情况下)——我认为这是一个错误。
  • Josh M. 这是如此广泛的规定,我不认为这是一个“错误”......(我同意这个答案并没有真正回答推理)
【解决方案3】:

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

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

在第一个周期中,所有变量和函数声明都被带到它正在执行的函数范围的顶部。这有助于在函数执行之前为函数的execution context 创建variableObjects

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

你有更详细的阅读 here.

它将让您更好地了解 letconstclass 声明的行为,以及变量和函数之间的优先级。

【讨论】:

  • 您是否暗示这是设计选择的结果?如果是这样,您应该在回答中明确说明。但是阅读 Brendan Eich 的回答,这可能是一个想要的功能,这取决于你如何解释最后一句话。底线,我仍然不知道为什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
相关资源
最近更新 更多