let和const

let和const

为什么要新增let

因为var不好用 缺陷如下: 1. var可以重复声明 2. var没有块级作用域 举个例子
 
  var name = 'yinxu'
                    if(true){
                        var name = 'work'
                        console.log(name); //work
                    }
                    console.log(name); //work


                    let a = [];
                    //这是一个父作用域
                    for (let i = 0; i < 10; i++) { //这是一个子作用域一共产生10次
                        a[i] = function () { //当前的i只在本轮循环有用
                            console.log(i);
                        };
                    }
                    a[6](); // 6

 

let的特点

  • let不存在变量提升

    var命令会存在变量提升的现象,即变量可以在声明之前使用,为了纠正这种现象let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则回报错 例如
  • console.log(faa); //undefined
                                    var faa = 10
    
                                    console.log(foo) //Uncaught ReferenceError: foo is not defined
                                    let foo = 1

     

  • 暂时性死区

    只要块级作用域内存在let命令,它所声明的变量就‘绑定’这个区域,不再受外部的影响
    var tmp = 123
                                    if(true){
                                        tmp = 'abc' //VM159:3 Uncaught ReferenceError: Cannot access 'tmp' before initialization
                                        let tmp;
                                    }

     

    es6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量从一开始就形成了 封闭作用域。凡是在声明之前就使用这些变量,对tmp会报错。 总之,在代码块内使用let命令声明变量之前,该变量都是不可用的,这在语法上称为暂时性死区
  •  if(true){
           tmp = 'aaa';
           console.log(tmp); //报错
    
            let tmp;
            console.log(tmp); //undefined
    
                        tmp = 123;
                        console.log(tmp); //123
              }
    一些死区比较隐蔽,不太容易发现
  • function bar (x=y,y=2){
            return [x,y]
        }
         bar() //VM164:1 Uncaught ReferenceError: Cannot access 'y' before initialization
                               
    上述代码中之所以会报错就是因为x默认等于y,而此时y还没有声明,属于死区。
    但是如果这么写就不会报错
  • function bar(x=2,y=x) {
           return[x,y]
    }
           bar() //[2,2]

    总之,暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。

  • 不允许重复声明

    let不允许在相同作用域内重复声明同一个变量 
    • function func() {
               let a = 10
                var a = 1
        }

       


    •  

      const的使用
    • const声明一个只读的常量,一旦声明常量的值就不会发生改变
      const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。
    •  const b //VM272:1 Uncaught SyntaxError: Missing initializer in const declaration
                          const b = 10 //不报错
                          const b = 20 //Uncaught TypeError: Assignment to constant variable.

       

    • 本质
    • const实际上保证的并不是变量的值不变,而是变量指向的那个内存地址内的数据不变,对于简单数据类型(字符串,数字,布尔值)值就保存在
posted @ 2021-08-18 19:01  krank  阅读(32)  评论(0编辑  收藏  举报