ES6 - 变量的作用域

在说明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在此处不存在
}