zoukankan      html  css  js  c++  java
  • 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实际上保证的并不是变量的值不变,而是变量指向的那个内存地址内的数据不变,对于简单数据类型(字符串,数字,布尔值)值就保存在
  • 相关阅读:
    jquery ajax 赋值问题, 后面程序判断逻辑用
    jquery formValidator 表单验证插件, ajax无法传值到后台问题的解决
    学习写了一个点击按钮倒计时的jquery小插件
    点击按钮复制指定代码
    discuz 修改积分策略( 在周期中添加"每周" )
    php获取本周周一、周日时间,上周周一、周日时间,本月第一天,本月最后一天,上个月第一天,最后一天时间
    php用正则判断是否为数字
    discuz 标签详解
    用dwz时, 由于粗心产生的一些问题(记录方便自己查阅)
    yii mailer 扩展发送邮件
  • 原文地址:https://www.cnblogs.com/code-klaus/p/15158380.html
Copyright © 2011-2022 走看看