为什么JavaScript提升变量?

Xla*_*ius 77 javascript hoisting

为什么JavaScript提升变量?

设计师决定实施吊装时的理由是什么?还有其他流行语言吗?

请提供文档和/或记录的相关链接.

小智 52

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

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

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

因此,我们可以使用"提升"概念来描述这种行为.

希望这可以帮助.

  • 呃,这并没有真正解释理由.单程翻译(不会导致提升)会简单得多 - 那么设计师为什么选择两次通过呢? (14认同)
  • 我个人_really_不喜欢"吊装"这个词.它给出了虚假的表示,即变量和函数声明被神奇地提升到当前作用域的顶部,实际上,正如你所提到的,JS解释器扫描源代码以获取绑定,然后**执行代码. (13认同)
  • 这个答案并没有真正解释为什么设计者决定实现吊装,只是解释了导致吊装的原因。所以我也会给-1。正如 @gfullam 提到的另一个答案,“提升”的结果可能是意想不到的。 (2认同)

gfu*_*lam 25

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

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

他还解释说……

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

布伦丹·艾希

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

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

  • 给予+1,因为这是尝试直接解决问题的唯一答案。 (4认同)
  • 不正确。Python 没有变量提升。请参阅:https://discuss.python.org/t/why-does-python-have-variable-hoisting-like-javascript/4944/3 (3认同)
  • 谢谢你的回答。我完全同意@Damon! (2认同)