我已经阅读并通过我自己的经验发现,JavaScript没有块作用域。假设这种语言是出于某种原因而设计的,您能向我解释那是什么原因吗?
我已经在Google和此处四处查看,但是我发现的帖子只是重申JS具有函数作用域而不是块作用域,而没有解释原因。我很好奇为什么会这样。
Answers:
将我的评论转换为答案
创建者的选择:我在Brendan上发布了一条推文,得到以下答案:
@mplungjan 10天没有为块范围保留时间。同样,在90年代中期的许多“脚本语言”的作用域也很少,后来又增加了。
也就是说,这里有一些相关的要点:
重要提示:ECMAScript2015(第6版)之前的JavaScript没有阻止范围。块中引入的变量的作用域为包含的函数或脚本,并且设置变量的效果将持续到块本身之外。换句话说,block语句不会引入作用域。尽管“独立”块是有效的语法,但是您不希望在JavaScript中使用独立块,因为如果您认为独立块在C或Java中的作用类似于此类块,则它们不会像您想的那样工作。
我们可以通过创建新功能并立即调用它们来人为地引入作用域
let
和const
声明的变量高挂,但他们都没有初始化undefined
以同样的方式var
是。因此,在赋值之前声明一个let
或const
声明的变量会引发ReferenceError。
在同一块作用域中重新声明相同变量会引发SyntaxError。
let
并且已const
声明的变量已被吊起,但undefined
直到我查看此代码示例之前,它们都未初始化为”。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference / ...您是否正在使用该语句谈论时间盲区?
截至2015年的新答案。ES6确实具有使用let
和const
关键字的变量定义的块范围。
let
。或者,您可以使用一种可让您在ES6中编写代码的编译器,然后该编译器将其转换为与ES5兼容的代码,从而使其可以在较旧的浏览器中运行。
try/catch
从ES3
catch
处理程序中,OP所要求的不太可能,并且不能以任何通用方式用于在ES3中的常规块中创建自己的块范围变量。) OP的问题,然后随时提出自己的答案
由于以下原因,未实现块范围:
if
语句中声明并定义变量。在像C这样的语言中,您将必须在if
语句外声明变量,然后在if
语句内定义变量。I
:能否提供给我们证明Brendan Eich出于提到的5个原因未在Javascript中实现块作用域的资源?我怀疑您是将历史原因(#1)与您的原因(#2至#5)混在一起。。。II
:#3错误:始终创建变量,只有其初始化是有条件的(请参阅:jsfiddle.net/paercebal/yvwhu7r0)。#4是伪造的("use strict" ;
在Chrome中添加会导致错误:)Uncaught SyntaxError: In strict mode code, functions can only be declared at top level or immediately within another function.
。#5是一个肮脏的解决方法。。。。
原因很多,但想到的一些原因是有助于解析/调试使用对象文字的代码(有时看起来像一个块),并简化局部变量的垃圾收集。
我希望所承诺的支持(例如,在此处讨论,例如http://esdiscuss.org/notes/2012-07-25)能成为现实,因为使用这样的变量非常方便,因为它们i
仅在本地单回路。
let
ES6中即将出现,因此在不久的将来我们将具有块作用域。Firefox已经支持let
。