在说明ES6的作用域之前,先提一下ES5中的规定的作用域:全局作用域和函数作用域
但是在ES6中新增了一种作用域:块级作用域
那么为什么要新增一种块级作用域呢?
这是因为只有全局作用域和函数作用域时,有如下问题:
变量提升:
①。在js中用var ,function声明的变量都将被提到函数的最顶部。(但是不会初始化)
②。函数声明的优先级大于变量声明的优先级(function > var )
③。在函数内部变量提升的优先级会小于函数参数(函数参数 > 函数内部变量提升)
例1:
console.log(a)
var a = 3;
// undefined
这是因为变量提升的第一条,把a变量提升到最顶部而不初始化。
等同于:
var a;
console.log(a)
a = 3;
例2:
f1();
console.log(b);
console.log(c);
console.log(a);
function f1() {
var a = b = c = 9;
console.log(a);
console.log(b);
console.log(c);
}
// 9 9 9 9 9 报错
等同于:
function f1() {
var a;
a = b = c = 9; // *注意这里的b、c没有使用var声明,等同于全局变量
console.log(a);
console.log(b);
console.log(c);
}
f1();
console.log(b);
console.log(c);
console.log(a);
ES6中的块级作用域
用let命令新增了块级作用域,外层作用域无法获取到内层作用域,非常安全明了。即使外层和内层都使用相同变量名,也都互不干扰。
块级声明用于声明在指定块的作用域之外无法访问的变量,它存在于:
1、函数内部
2、{}之间的块区域内
例2:
function getValue(condition){
if(condition){
let value = 'blue';
return value;
}else{
//变量value在此处不存在
return null;
}
//变量value在此处不存在
}