(声明, 本文的所有代码均在node的最新稳定版本v4.4.3中执行的, 如果在浏览器中执行请把JS的运行环境提升为ES6)

  以前一直用var定义变量, 现在有了两种新的定义变量的方式, 1: let, 2: const;本文大概概括下使用letconst定义变量有哪些好处;

    1:声明提前

  使用var声明变量,存在声明提前的问题, 输出的tmp为"undefined":

{
    var tmp = new Date();

    let f = function (){
        console.log(tmp); //undefined
        if (false){
            //使用var声明变量的声明提前;
            var tmp = "hello world";
        }
    }

    f();
}

  如果我们把定义tmp的方式改为let呢? 那么tmp输出的结果为当前的日期。

{
    var tmp = new Date();

    let f = () => {
        console.log(tmp); //输出的结果为当前的日期
        if (false){
            //使用let的方式声明, tmp的作用域只有在离他最近的一个{}括号中;
            let tmp = "hello world";
        }
    }

    f();
}

    2:块状作用域

  letconst不但拥有块状作用域, 还也不存在声明提前这个玩意儿, 以下代码会报ReferenceError

{
    let tmp = 123;
    {
        tmp = 234;
        let tmp = 456;
    }
}

 

  使用let声明的元素作用域更加明确, 不会出现作用域混乱的情况, 可以减少bug的产生;

{
    let foo = 0;
    {
        let foo = 1;
        foo = 2;
    }
    console.log(foo);
}

  以上这段代码相当于是IIFE(立即执行函数表达式), 效果和以下的相同;

{
    var foo = 0;
    (function(){
        var foo = 1;
        foo = 2;
    }());
    console.log(foo);
}

  再来猜猜这个的结果是什么,( var 形式声明的变量会提升到{}外面去哦 , {}形式的块状作用域相当于是if(true){//code}的写法):

{
    var foo = 0;
    {
        var foo = 1;
        foo = 2;
    }
    console.log(foo);
}
View Code

相关文章: