为什么JavaScript提升变量?

时间:2013-02-21 14:45:20

标签: javascript hoisting

为什么JavaScript会提升变量?

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

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

3 个答案:

答案 0 :(得分:47)

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

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

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

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

答案 1 :(得分:11)

JS创造者Brendan Eich once said (on Twitter)

“因此,无功起吊是功能起吊的意外结果,没有块作用域,[和] JS是1995年的紧急工作。”

他还解释了……

“函数提升允许自上而下的程序分解,在声明之前调用,可免费使用'let rec';在声明之前进行变量提升。”

Brendan Eich

还有其他流行的语言吗?

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

更新:根据评论,Python has similar variable hoisting behavior

答案 2 :(得分:0)

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

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

在第一个循环中,所有变量和函数声明都将移至其正在执行的函数作用域的顶部。这有助于在执行之前为函数variableObjects创建execution context

在第二阶段,按预期方式逐行进行值分配,代码语句和函数调用。

您已阅读了一些更详细的内容 here.

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