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

mri*_*cci 69 javascript scope

我已阅读并通过自己的经验发现JavaScript没有块范围.假设语言是出于某种原因而设计的,那是什么原因?

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

mpl*_*jan 114

将我的评论转换为答案

创作者的选择:我在推特上发布了Brendan并得到了以下答案:

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


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

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

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

letconst声明的变量高挂,但他们都没有初始化undefined以同样的方式var是.因此,在赋值之前引用letconst声明变量会引发ReferenceError.

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


jfr*_*d00 15

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

  • 不幸的是,有些用户可能仍然生活在2010年,所以依靠全新的语言功能并不是最好的做法. (2认同)

Aad*_*hah 12

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

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

  • "块范围为JavaScript等动态语言带来了性能影响." - 这是实现的属性,而不是语言.也许它适用于第一个JavaScript实现,但过去十年中没有编写的引擎应该受其影响. (3认同)
  • `I`:你能否告诉我们Brendan Eich在你提到的5个理由中没有在Javascript中实现块范围的来源?我怀疑你是否将历史原因(#1)与你的理由(#2到#5)混合在一起...`II`:#3错误:始终创建变量,只有初始化是有条件的(参见:https://jsfiddle.net/paercebal/yvwhu7r0/).#4是假的(添加`"use strict"; Chrome中的`给出了错误:`Uncaught SyntaxError:在严格模式代码中,函数只能在顶级或紧接在另一个函数中声明.).#5是一个肮脏的解决方法.... (2认同)