zoukankan      html  css  js  c++  java
  • JS中let和var 的区别

    let和var的区别

    1. 通过var关键字声明的变量没有块作用域,在块{ }内声明的变量可以从块之外进行访问。

        通过let关键字声明的变量拥有块作用域,在块{ }内声明的变量无法从块外访问

    eg:

    { 
      var x = 10; 
    }
    // 此处可以使用 x
    
    { 
      let x = 10;
    }
    // 此处不可以使用 x

    2. 通过var关键字重新声明变量会带来问题,在块中声明变量也将重新声明块外的变量,覆盖块外的变量

        通过let关键字重新声明的变量不会重新声明块外的变量,会重新声明一个有块作用域的变量

    eg:

    var x = 10;
    // 此处 x 为 10
    { 
      var x = 6;
      // 此处 x 为 6
    }
    // 此处 x 为 6
    var x = 10;
    // 此处 x 为 10
    { 
      let x = 6;
      // 此处 x 为 6
    }
    // 此处 x 为 10

    3. 通过var关键字在循环中使用会重新声明循环之外的变量,覆盖循环之外的变量,会保存循环内对变量的改变

        通过let关键字在循环中使用不会重新声明循环之外的变量,会重新声明一个有块作用域的变量,并且不会保存循环内对变量的改变

    eg:

    var i = 7;
    for (var i = 0; i < 10; i++) {
      // 一些语句
    }
    // 此处,i 为 10
    let i = 7;
    for (let i = 0; i < 10; i++) {
      // 一些语句
    }
    // 此处 i 为 7

    4. 通过 var 关键词定义的全局变量属于 window 对象

        通过 let 关键词定义的全局变量不属于 window 对象

    eg:

    var carName = "porsche";
    // 此处的代码可使用 window.carName
    let carName = "porsche";
    // 此处的代码不可使用 window.carName

    5. 通过 var 声明的变量会提升到顶端

       通过 let 定义的变量不会被提升到顶端,在声明 let 变量之前就使用它会导致 ReferenceError,变量从块的开头一直处于“暂时性死区”,直到声明为止。    let要求必须 等let声明语句执行完之后,变量才能使用

       在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。

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

    eg:

    // var 的情况
    console.log(foo); // 输出undefined
    var foo = 2;
    
    // let 的情况
    console.log(bar); // 报错ReferenceError
    let bar = 2;

    有一部分死区很难发现

    eg:

    function bar(x = y, y = 2) {
      return [x, y];
    }
    
    bar();//报错,因为x=y时,y还没有声明属于死区

    想反,下面这种情况就不会报错。

    function bar(x = 2, y = x) {
      return [x, y];
    }
    bar(); // [2, 2]

    let和var的共同点

        在函数内声明变量时,使用 var 和 let 很相似,它们都有函数作用域

        如果在块外声明声明,那么 var 和 let 也很相似,它们都拥有全局作用域

    注:

       允许在程序的任何位置使用 var 重新声明 JavaScript 变量

       在相同的作用域,或在相同的块中,通过 let 重新声明一个 var 变量是不允许的

       在相同的作用域,或在相同的块中,通过 let 重新声明一个 let 变量是不允许的

       在相同的作用域,或在相同的块中,通过 var 重新声明一个 let 变量是不允许的

       在不同的作用域或块中,通过 let 重新声明变量是允许的

      不能在函数内声明参数

    eg:

    function func(arg) {
      let arg;
    }
    func() // 报错
    
    function func(arg) {
      {
        let arg;
      }
    }
    func() // 不报错
  • 相关阅读:
    Linux下常用命令以及应用场景
    Java通过代理访问网络的几种方法
    Linux下模拟Http发送的Get和Post请求
    Postgresql常用函数整理
    java-日期Calendar类
    利用数组保存 6 个 Circle 对象,创建 Circle 对象时可传递半径,半 径值由 Math 类的 Random()方法产生( 10 以内,保持一位小数),分别求其面积 (四舍五入,保持两位小数)
    第十讲 Java 资源结构-api
    浅谈面向对象与女娲造人 (摘自 Nerxious)
    java-打印字母表
    java反射机制
  • 原文地址:https://www.cnblogs.com/wjrelax/p/11238278.html
Copyright © 2011-2022 走看看