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

时间:2013-06-26 04:42:49

标签: javascript scope

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

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

4 个答案:

答案 0 :(得分:111)

将我的评论转换为答案

创作者的选择:我在推特上发布了Brendan并获得了following answer

  

@mplungjan 10天没有为块范围留出时间。此外,90年代中期的许多“脚本语言”的范围和范围也很少。后来长大了。


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

  

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

  

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

letconst声明的变量已悬挂,但它们 未按照undefined的相同方式初始化为var。因此,在分配值之前引用letconst声明的变量会引发ReferenceError。

在同一块范围内重新声明相同的变量会引发SyntaxError。

答案 1 :(得分:14)

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

答案 2 :(得分: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模拟它们。

答案 3 :(得分:0)

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

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