我已阅读并通过自己的经验发现JavaScript没有块范围。假设语言是出于某种原因设计的,你能解释一下这是什么原因吗?
我在谷歌和这里看过,但我发现的帖子只是重申JS有一个功能范围而不是阻止范围,没有解释原因。我很想知道为什么会出现这种情况。
将我的评论转换为答案
创作者的选择:我发推特布兰登并获得了following answer:
@mplungjan 10天没有为块范围留出时间。此外,90年代中期的许多“脚本语言”的范围很小,而且后来增长得更多。
也就是说,这里有一些相关的观点:
重要提示:JavaScript没有块范围。块中引入的变量的范围限定为包含函数或脚本,设置它们的效果将持续超出块本身。换句话说,块语句不引入范围。虽然“独立”块是有效的语法,但您不希望在JavaScript中使用独立块,因为如果您认为它们在C或Java中执行类似块的操作,则它们不会按照您的想法执行。
我们可以通过创建新函数并立即调用它们来人为地引入范围
let
和const
声明变量被悬挂,但它们没有像undefined
那样初始化为var
。因此,在分配值之前引用let
或const
声明的变量会引发ReferenceError。
在同一块作用域中重新声明相同的变量会引发SyntaxError。
截至2015年的新答案.ES6确实具有使用let
关键字的变量定义的块范围。
由于以下原因,未实施块范围:
if
语句中声明和定义变量。在像C这样的语言中,你必须在if
语句之外声明变量,并在if
语句中定义它。有许多原因,但有些想法是帮助解析/调试使用对象文字的代码(有时看起来像一个块),并简化局部变量的垃圾收集。
我希望所承诺的支持(这里讨论,例如,http://esdiscuss.org/notes/2012-07-25)证明是真实的,因为使用像i
这样的变量非常方便,这些变量只对一个循环是局部的。