为什么block范围最初不是在JavaScript中实现的?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

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

我在谷歌和这里看过,但是我发现的帖子只是重申了JS的功能范围,并没有解释范围,没有解释原因。我很想知道为什么事实如此。

提问于
用户回答回答于

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

重要提示:JavaScript没有块范围。一个块中引入的变量的作用域为包含函数或脚本,并且设置这些变量的效果会持续超出块本身。换句话说,块语句不会引入范围。尽管“独立”模块是有效的语法,但您不希望在JavaScript中使用独立模块,因为如果您认为它们在C或Java中执行类似块的操作时,它们不会执行您认为它们的操作。

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

let声明的变量不会被挂起到封闭块的开始处。因此,在let赋值之前引用声明的变量会引发ReferenceError。

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

用户回答回答于

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

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

扫码关注云+社区