JavaScript中没有块级做用域常常会致使理解上的困惑,在其余类C的语言中,由花括号封闭的代码都有本身的做用域,于是支持根据条件来定义变量。可是在JavaScript中下面的代码并不会获得想象中的结果:javascript
if(true){ var aa = 'red'; } console.log(aa);//red
这里在if
语句中定义了一个变量aa
,若是是在C、C++或Java中,aa
会在if
语句执行完毕后被销毁。但在JavaScript中,if
语句里的变量声明会将变量添加到当前的执行环境,而JavaScript中的执行环境一般只有两种——全局执行环境和局部执行环境,局部执行环境通常就是函数,因此这里的aa
是定义在全局执行环境中,也就是做为window对象的属性存在的,以下图:前端
因此根据做用域链机制会正常打印red
。java
没有块级做用域是个缺点,好在ES6把这个问题解决了,新标准中引入了关键字let
,支持了块级做用域,看下面代码:函数
if(true){ let aa = 'red'; console.log(aa);//red } console.log(aa);//Uncaught ReferenceError: aa is not defined
改用let
声明变量aa
,在if
块里面能够访问aa
,外面就报错了。学习
由下图也能够看出,aa
并无被声明在window
上,而是在全局做用域Global
的前端增长了一个Block
做用域,而Block
正是块的意思,根据做用域链机制能够在if
块内部访问到aa
。code
因此若是用的是ES5,那是无法使用块级做用域的。ES6出来有几年了,浏览一下各主流明星互联网公司的招聘需求,基本都要求熟悉ES6标准,建议读者们都学习一下。对象