javascript里面的var let const关键字区别和使用

  var let const都能定义变量,我们应该怎么取舍呢。

  结论:优先使用const 其次是let,最后才是var(尽量避免使用)

      一、var 的介绍

        作用域范围: 函数级别的作用域

    function getAgeVar(){
            //这样输出不报错
            console.log(age)
            if(true){
                var age = 18;
            }
            console.log(age)
            return age;
        }

   函数级别的作用域:意味着可以在if 条件之外的函数内可以访问到age。

       声明提升: 在声明之前可以输出age,不报错。

       var 定义的全局变量,会赋值到windows 上。

        var x = 10;
        //通过var 定义的全局变量,能通过window 访问到。
        console.log(window.x)

    var 还有一个问题就是,同名的变量会一直叠加。

  这里就会有一道经典的面试

        for(var i = 0; i < 10; i++){
                
        }
        console.log(i)

  可以在循环外输出i,i的值等于10,这个就是变量叠加了。

        for(var i = 0; i < 10; i++){
            setTimeout(function(){
                //这个会因为变量叠加一直输出10,因为是函数级作用域,就是会出现变量叠加。
                console.log(i)
            },0)
        }

  上面这个断面也不会按照我们想的一直输出,0-9。而是直接就输出10次10。也是上面说的变量叠加问题(函数级作用域的影响,导致所有for循环上的i 是共享的。

  原因:setTimeout 是异步操作,回调函数会被推入任务队列,但不会立即执行。

             主线程会先执行完整个 for 循环(此时 i 已递增到 10),然后才会处理任务队列中的回调。

   二、let 的介绍

   作用域范围:块级作用域

  // Uncaught ReferenceError: age is not defined
            //console.log(age)  
           
            if(true){
                let age = 18;
                //因为let 定义的变量,只能在当前作用域中访问到。
            }
             //这样报错:
            // Uncaught ReferenceError: age is not defined
            //console.log(age)

  没有变量提升,就是作用域在{} 块级作用域里面。

  let定义的全局变量 也不会挂载到window 对象上,也不允许变量叠加。

    for(let i = 0; i < 10; i++){
            //let 每次都会定义一个新的变量。因为这里面有了一个function {}有了一个块,所以每次都是新变量。
            setTimeout(function(){
                console.log(i)
            },0)  
        }

  这个let会每次都当做一个新的变量,所以上面会按照输出0-9。 因为每个let 变量定义的i 都是块级作用域,也就是在每一次for循环里面单独搞了一个新变量。

      三、const 的介绍

         作用域范围:块级作用域

   const 常量的意思,不能再次修改和赋值。

       const message = "Hello, World!";
        message = "Hello, JavaScript!"; // 报错:Assignment to constant variable.
  const 声明只是声明了一个变量的引用, 是可以改变里面的属性的值的。这个针对对象来说的,const定义的对象是可以修改的
      const objA={name:'张三',age:18}
        objA.name='李四'
        objA.age=19
        console.log(objA)

  对于for 循环,const 是不能用来定义 循环里面的迭代变量的,也就是i++。

      但是可以用来定义循环里面不需要迭代的变量。

   let i=0;
        for(const j=7;i<10;i++){
            console.log(j);
            //输出了10次7 
        }

  还可以用在for in或者for of循环中。

   const numbers = [1, 2, 3, 4, 5];
        //const 是块级作用域,每次都是等于一个新的number变量。
        //但是你不能在块级作用域里面修改它,因为就相当于你一次的for循环中,定义了一个const变量,然后你又想重新赋值,这个是不被允许的。
        for(const number of numbers){
            var tt=number+1;
            console.log(tt)
        }
        
        const str="hello";
        for(const char of str){
            console.log(char) 
        }

  四、总结

  1、优先使用const

  • 当变量的值在声明后不需要改变时,应该优先使用 const。这样可以提高代码的可读性和可维护性,让其他开发者一眼就能看出该变量是常量,避免意外的修改。
  • 使用 const 还能减少代码中的错误,因为 JavaScript 引擎会阻止对常量的重新赋值操作。

    2、其次使用let

  • 当变量的值需要在后续代码中改变时,使用 let。由于 let 具有块级作用域,能有效避免变量泄漏问题,让代码的作用域更加清晰。

  3、避免使用var

  • 由于 var 的函数作用域和变量提升特性,容易导致变量泄漏和意外的变量覆盖问题,使得代码的行为难以预测。在现代 JavaScript 开发中,除非有特殊需求,否则应尽量避免使用 var

 

      

posted @ 2025-04-26 21:08  GDOUJKZZ  阅读(31)  评论(0)    收藏  举报