Why does JavaScript hoist variables?
为什么JavaScript提升变量?
设计师决定实施吊装时的理由是什么?
还有其他流行语言吗?
请提供文档和/或记录的相关链接。
-
"因为javascript并没有真正意义上的词汇范围",无论这意味着什么
-
太好了!你知道为什么吗 ?
-
我怀疑在这一点上它是历史性的,我严重怀疑它除了"易于实施"之外的其他任何东西。
-
它使初学者更容易学习语言。许多人编写javascript并且在他们转移到另一种语言之前不知道变量的范围。
-
也许你知道其他任何具有相似特征的语言?
-
因为没有它你可以得到难以排除故障的奇怪行为
-
@StenPetrov其他语言,也很容易(Python ......)不要提升!
-
另一种语言也是VBScript。
-
老实说,问Brendan Eich,他似乎很反应。
-
想象一下这个`var a = 0; function a(){setTimeout(function(){alert(a)},1000)var a = 10;当超时触发时,它可以访问'a',因为它处于封闭范围内,这是有道理的,如果不提升会发生什么?它应该警告0,因为尚未定义本地,但是在超时触发时它被定义
-
这个问题怎么没有建设性?
-
@Francisc欢迎使用Stack Overflow,您可以询问的是在jQuery中移动div
-
你是对的,对不起!
-
这是一个非常重要的问题。应该是允许的。这不是火焰诱饵。提升是理解JavaScript如何工作的核心要素之一,"为什么"是一个合理的问题,在大多数语言的教科书处理中得到解决。 Stack Overflow人员不断踩人们这样的问题是不行的。
-
我也认为这是一个重要的问题。我特意搜索了为什么JS提升变量,以便我可以利用其所谓的好处和优势,这么多教程声称。我想按照预期编写JS代码。实际上,这可能是JS中最重要的问题之一。也许它应该被重写为,JS变量提升有什么好处。
-
@FelixKling Re:Brendan Eich。问及&等待回复twitter.com/geraldfullam/status/961621904330248193
正如Stoyan Stefanov在"JavaScript Patterns"一书中解释的那样,提升是JavaScript解释器实现的结果。
JS代码解释分两次执行。在第一次传递期间,解释器处理变量和函数声明。
第二遍是实际的代码执行步骤。解释器处理函数表达式和未声明的变量。
因此,我们可以使用"提升"概念来描述这种行为。
-
我个人真的不喜欢"吊装"这个词。它给出了虚假的表示,即变量和函数声明被神奇地提升到当前作用域的顶部,实际上,正如你所提到的,JS解释器扫描源代码以获取绑定,然后执行代码。
-
现在我知道为什么JS最容易误解语言,我没有在任何教程中看到这一点。并与提升(和解释器流)混淆。
-
呃,这并没有真正解释理由。单程翻译(不会导致提升)会简单得多 - 那么设计师为什么选择两次通过呢?
-
这并不能解释为什么变量,特别是悬挂变量。函数有意义,变量没有(在大多数情况下) - 我认为这是一个错误。
-
Josh M.这是如此广泛的指定,我不认为这是一个"错误"......(我同意这个答案并没有真正回答这个推理)
这是因为javascript解释器在两个周期内解释代码。
代码完成/编译:
代码执行:
在第一个循环中,所有变量和函数声明都被带到它正在执行的函数作用域的顶部。这有助于在函数执行之前为execution context函数创建variableObjects。
在第二阶段,值分配,代码语句和函数调用以预期的方式逐行进行。
你有一个更详细的阅读
这里。
它将为您提供围绕let,const和class声明的行为的更好的图像,以及变量和函数之间的优先级。
-
您是否暗示这是设计选择的结果?如果是这样,你应该在答案中清楚说明。但阅读Brendan Eich的回答,它可能是一个想要的功能,它取决于你如何解释最后一句话。最重要的是,我仍然不知道为什么肯定