我读过并通过自己的经验发现,JavaScript 没有块级作用域。假设这种语言被设计成这种方式是有原因的,请问可以向我解释一下这个原因吗?
我在谷歌和这里找到的文章只是重申 JS 具有函数作用域而不是块级作用域,但没有解释为什么会这样。我很好奇实际上是什么原因导致了这种情况。
我读过并通过自己的经验发现,JavaScript 没有块级作用域。假设这种语言被设计成这种方式是有原因的,请问可以向我解释一下这个原因吗?
我在谷歌和这里找到的文章只是重申 JS 具有函数作用域而不是块级作用域,但没有解释为什么会这样。我很好奇实际上是什么原因导致了这种情况。
将我的评论转换为答案
创建者的选择:我在推特上@了Brendan,得到了以下回答:
@mplungjan 10天时间不足以实现块级作用域。此外,那个90年代中期的许多“脚本语言”范围很小,并且后来才逐渐增加。
话虽如此,以下是一些相关要点:
重要提示:ECMAScript2015(第6版)之前的JavaScript没有块级作用域。在块内引入的变量作用域限于包含函数或脚本,并且设置它们的效果会持续超出块本身。换句话说,块语句不会引入作用域。虽然“独立”的块是有效的语法,但是你不应该在JavaScript中使用独立块,因为它们不会像C或Java中的这些块那样做你认为它们会做的任何事情。
我们可以通过创建新函数并立即调用它们来人为地引入作用域。
let
和const
声明的变量被提升,但它们不会像var
一样初始化为undefined
。因此,在分配值之前引用let
或const
声明的变量会引发ReferenceError。
在同一块级别作用域内重新声明相同的变量会引发SyntaxError。
let
和 const
声明的变量会被提升但不会被初始化为 undefined
" 这句话,直到我看了这个代码示例 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let#Another_example_of_temporal_dead_zone_combined_with_lexical_scoping 。你是在谈论暂时性死区吗? - christo8989截至2015年的新回答。 ES6在使用let
和const
关键字定义变量时具有块级作用域。
let
。或者,您可以使用其中一个转译器,让您在 ES6 中编写代码,然后将其转换为 ES5 兼容代码,以便在旧版浏览器中运行。 - jfriend00try/catch
块作用域。 - Trungcatch
处理程序中),这不太可能是OP所问的,并且不能以任何通用方式在ES3常规块中创建自己的块作用域变量。如果您认为这回答了OP的问题,请随意提供您自己的答案。 - jfriend00以下是未实施块级作用域的原因:
if
语句内声明并定义变量。在 C 等语言中,您必须在 if
语句外声明变量并在 if
语句内定义变量。有很多原因,但一些我想到的是为了帮助解析/调试使用对象字面量(有时看起来像块)的代码,并简化本地变量的垃圾收集。
我希望承诺的支持(例如在此处讨论:http://esdiscuss.org/notes/2012-07-25)能够得到实现,因为这将非常方便,可以使用仅限于单个循环的本地变量,例如i
。
let
,所以我们很快就会拥有块级作用域。Firefox已经支持let
。 - elclanrs