es6块级作用域

一.为什么需要块级作用域:

1.es5中只有全局作用域和块级作用域,内层变量可能会覆盖外层变量

var time=new Date();//全局变量
function fun(){
    console.log(time);
    if(false){
    var time="hello world";
    };
};
fun();//undefined

  没有输出new Date();因为在调用函数时,输出time,time为全局值,由于在函数里面有var函数内部的time会覆盖外面的time的地址,找不到time的地址,所以就不能找到time的值

2.用来计数的循环变量泄露为全局变量

var string="hello world";
for(var i=0;i<string.length;i++){
    console.log(string[i]);
};
console.log("循环结束");
console(i);//12(i跳出了循环体)

二.es6的块级作用域

let、const为javascript新增了块级作用域。

//es5
console.log("es5:");
function fun(){
    var num=100;
    if(true){
        var num=200;
    }
    consloe.log(num);
}
fun();//200;

//es6
console.log("es6:");
function fun(){
    let num=100;
    if(true){
        let num=200;
    }
    consloe.log(num);
}
fun();//100;

  es5中的var结果为200因为内层变量影响到了外层变量,所以200覆盖100,es6中,内部不会影响外部,为两个相对独立的作用域

//es5----------------------------
function fun(){
    console.log("i love you");
}


(function (){
if(false){
    function fun(){
    console.log("i love him");
    };
};

        fun();//i love you
}());//立即执行函数,不管判断会先执行,后面的会覆盖外面的fun()的

//es6:---------------------------

function fun(){
    console.log("i love him");
}
{
    if(false){
    function fun(){
            console.log("i love you");
        };
    };
    fun();//i love him(内部模块不会影响外部模块)
};

  在let和const中,有限使用const,

原文地址:https://www.cnblogs.com/zzzha/p/8551639.html