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