在js中let与var声明变量的区别

ES6 新增了let命令,用来声明局部变量,所声明的变量,只在let命令所在的代码块内有效,而且有暂时性死区的约束。

  1. ES6可以用let定义块级作用域变量
    代码如下:
   function f1(){
        {
            var a = 10;
            let b = 20;
        }
        console.log(a);   //  10
        console.log(b);   //  Uncaught ReferenceError: b is not defined
    }
    f1();

说明:在ES6之前只有全局作用域和函数作用域,在ES6中新增了块级作用域,用{}花括号表示。var 声明的变量a在花括号外面仍然是会起作用的,但是let声明的变量b只有在花括号里面才会起作用的,在块级作用域内。

  1. let配合for循环的独特应用
    代码如下:
   function f2(){
       var i = 5;
       for(var i=0;i<=10;i++){

       }
       console.log(i);   //  11

       var j = 5;
       for(let j=0;j<=10;j++){

       }
       console.log(j); // 5

   }
   f2();

说明:let非常适合用于for循环内部的块级作用域,在for循环当中,每一次的执行都是一个全新的独立的块级作用域。使用let声明的变量在for循环当中不会受到循环体外面的影响,不会受到变量污染,不会发生改变。对于var声明的变量i会受到for循环的影响,受到变量污染,而let声明的变量j不会受到for循环的影响。

  1. let没有变量提升与暂时性死区
    代码如下:
    function f3(){

        // 变量提升
        function f31(){
            console.log(a);  // undefined
            var a = 10;

            console.log(b);  //  Uncaught ReferenceError: b is not defined
            let b = 10;
        }
        f31();

		// 暂时性死区
        function f32(){
            {
                a = 20;
                console.log(a);   //  Uncaught ReferenceError: a is not defined

                let a ;
                console.log(a);  // undefined

                a = 30;
                console.log(a);   //  30

            }
        }
        f32();

    }
    f3();

说明:在ES6中,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。暂时性死区(TDZ):在代码块内,使用let命令声明变量之前,该变量都是不可用的。在f31函数中,用var声明的变量a发生了变量提升,打印出的值为undefined 未定义,而用let声明的变量b报错Uncaught ReferenceError,不会发生变量提升。在f32函数中,用使用let命令声明的变量a之前,都属于变量a的暂时性死区,形成封闭作用域,该变量都是不可用的,会报错,Uncaught ReferenceError: a is not defined。在let声明变量后,它是一个未定义的变量。当再给变量a进行赋值操作以后,它的值可以正常打印出来。

  1. let变量不能重复声明
    代码如下:
    function f4(){
        let a = 10;
        let a = 20;
        console.log(a); // Uncaught SyntaxError: Identifier 'a' has already been declared

        let b = 10;
        var b = 20;
        console.log(b); // Uncaught SyntaxError: Identifier 'b' has already been declared

    }
    f4();

说明:let不允许在相同作用域内,重复声明同一个变量,否则报错。在函数f4中,无论是用两个let声明同一个变量a,还是一个let声明变量b和一个var声明变量b,都是会报错的,Uncaught SyntaxError: Identifier ‘a’ has already been declared 和 Uncaught SyntaxError: Identifier ‘b’ has already been declared , 所以不能够重复声明同一个变量。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值