var let const详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/WinstonLau/article/details/88621084

var

  • 如果有人问使用 var 定义的变量有什么特点,我相信很多人都会说它定义的变量是全局变量,其实这个说法是不严谨的,请看下面的解释

  • var 是 ES6之前 js 用来声明变量的方法,它具有如下特点:

    1. var 定义的变量的作用域是函数作用域,在函数内用 var 声明的变量,只在这个函数内有效,请看下面的代码

      function f() {
      	var a = 1;
      }
      //加上下面这句调用函数的语句,结果也是一样的
      //f();
      console.log(a); //ReferenceError: a is not defined
      

      需要特别强调的是,这里的 a 是在函数内用 var 定义的,函数内和 var 缺一不可,同时请注意和下面这几个例子相比较

      //这个例子没有写函数
      for (var i = 0; i < 3; i++) {
           continue;
      }
      console.log(i); //3
      

      也就是说,var 定义的变量的作用域是以函数为单位的,而不是我们通常所说的,用 var 定义的变量就是全局变量,如果一个用 var 定义的变量不在任何函数内,我们才能说它是全局变量

      function f() {
      	var a = 1;
      }
      f();
      console.log(a); //ReferenceError: a is not defined
      
      function f() {
      	var a = 1;
      }
      //f();
      console.log(a); //ReferenceError: a is not defined
      
      function f() {
      	a = 1;
      }
      f();
      console.log(a); // 1
      
      function f() {
      	a = 1;
      }
      //f();
      console.log(a); //ReferenceError: a is not defined
      

      【总结】:只要在函数内声明变量的时候,使用了 var 关键字,那么这个变量就是局部变量;如果没有使用 var 关键字,那么只有在这个函数被调用之后,这个变量才是全局变量(函数内部定义的方法和变量,要等到函数执行过以后,才会真正定义)

    2. var 定义的变量存在变量提升的现象,也就是在未声明之前即可使用,只不过这时变量的值是 undefined

      function test(){
           console.log(a); //undefined
           var a=3;
      }
      test();
      

let

  • let 也是用来声明变量的,但是它所声明的变量只在 let 命令所在的代码块内有效,请看下面两个例子,注意代码块和函数的区别

    {
    	 //是否初始化并不影响这里要说明的问题,因此也可以不初始化
         let a = 1;
         var b = 2;
    }
    //ReferenceError: a is not defined(引用错误:a没有定义)
    console.log(a); 
    console.log(b); //2
    
    {
         let a = 0;
         var b = 1;
    }
    function test(){
         console.log(a); //ReferenceError: a is not defined
         console.log(b); //1
    }
    test();
    
  • let 声明的变量的特点

    1. 变量所属的作用域是块级作用域(在 ES6 之前,js只存在函数作用域以及全局作用域)

    2. 不存在变量提升,即变量在声明之前不可使用

    3. 不能重复定义,即使用 let 关键字重复声明同一个变量

      let a = 1;
      let a = 2;
      //SyntaxError: Identifier 'a' has already been declared
      console.log(a);
      
    4. 存在暂时性死区

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

const

  • const 是用来声明常量,且声明的常量是不允许改变的,而且在声明的同时必须初始化

  • const 与 let 一样,其定义的变量都属于块级作用域,不存在变量提升,不允许重复定义,同时也存在暂时性死区

  • const 的本质: 使用 const 定义的变量并非所有的都是常量,当我们使用 const 来定义常量对象或常量数组时,常量对象或常量数组里的内容其实是可变的,只是不能对这个常量对象或常量数组进行重新赋值的操作。请看下面的代码

    // 创建常量对象
    const car = {type:"Fiat", model:"500", color:"white"};
    car.color = "red"; //修改属性
    car.owner = "Johnson"; //添加属性
    //TypeError: Assignment to constant variable
    car = {type:"Volvo", model:"EX60", color:"red"}; //错误
    
    // 创建常量数组
    const cars = ["Saab", "Volvo", "BMW"];
    cars[0] = "Toyota"; //修改元素
    cars.push("Audi"); //添加元素
    //TypeError: Assignment to constant variable
    cars = ["Toyota", "Volvo", "Audi"]; //错误
    

猜你喜欢

转载自blog.csdn.net/WinstonLau/article/details/88621084
今日推荐