为什么块范围最初并未在JavaScript中实现?

问题描述 投票:68回答:4

我已阅读并通过自己的经验发现JavaScript没有块范围。假设语言是出于某种原因设计的,你能解释一下这是什么原因吗?

我在谷歌和这里看过,但我发现的帖子只是重申JS有一个功能范围而不是阻止范围,没有解释原因。我很想知道为什么会出现这种情况。

javascript scope
4个回答
111
投票

将我的评论转换为答案

创作者的选择:我发推特布兰登并获得了following answer

@mplungjan 10天没有为块范围留出时间。此外,90年代中期的许多“脚本语言”的范围很小,而且后来增长得更多。


也就是说,这里有一些相关的观点:

重要提示:JavaScript没有块范围。块中引入的变量的范围限定为包含函数或脚本,设置它们的效果将持续超出块本身。换句话说,块语句不引入范围。虽然“独立”块是有效的语法,但您不希望在JavaScript中使用独立块,因为如果您认为它们在C或Java中执行类似块的操作,则它们不会按照您的想法执行。

我们可以通过创建新函数并立即调用它们来人为地引入范围

letconst声明变量被悬挂,但它们没有像undefined那样初始化为var。因此,在分配值之前引用letconst声明的变量会引发ReferenceError。

在同一块作用域中重新声明相同的变量会引发SyntaxError。


14
投票

截至2015年的新答案.ES6确实具有使用let关键字的变量定义的块范围。


12
投票

由于以下原因,未实施块范围:

  1. 它使语言更容易实现。 JavaScript最初被设计为用于编写交互式Web应用程序的语言。因此,它需要小而易于实施。
  2. 块范围为JavaScript等动态语言带来性能影响。这是因为当您尝试访问某个不在当前范围内的变量时,JavaScript首先检查当前范围,然后检查父范围,依此类推,直到找到变量或到达结尾。因此,块作用域的引入会使循环和嵌套循环中的变量访问变得非常慢。
  3. 缺少块范围使编写程序变得更容易。例如,假设您只想在某个条件为真时创建变量。您在JavaScript中需要做的就是在if语句中声明和定义变量。在像C这样的语言中,你必须在if语句之外声明变量,并在if语句中定义它。
  4. 块范围的缺乏允许声明被提升。这在函数声明的情况下特别有用。例如,请看这个小提琴:http://jsfiddle.net/L6SgM/(请注意,此示例在Firefox中不起作用)。
  5. 由于JavaScript支持第一类函数表达式,因此我们不需要块作用域。它们可以使用immediately invoked function expressions进行模拟。

0
投票

有许多原因,但有些想法是帮助解析/调试使用对象文字的代码(有时看起来像一个块),并简化局部变量的垃圾收集。

我希望所承诺的支持(这里讨论,例如,http://esdiscuss.org/notes/2012-07-25)证明是真实的,因为使用像i这样的变量非常方便,这些变量只对一个循环是局部的。

© www.soinside.com 2019 - 2024. All rights reserved.