JavaScript执行环境及做用域(三)——没有块级做用域

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对象的属性存在的,以下图:前端

因此根据做用域链机制会正常打印redjava

没有块级做用域是个缺点,好在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块内部访问到aacode

因此若是用的是ES5,那是无法使用块级做用域的。ES6出来有几年了,浏览一下各主流明星互联网公司的招聘需求,基本都要求熟悉ES6标准,建议读者们都学习一下。对象

相关文章
相关标签/搜索