惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
F
Fortinet All Blogs
博客园 - 聂微东
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hugging Face - Blog
Hugging Face - Blog
V
Visual Studio Blog
小众软件
小众软件
有赞技术团队
有赞技术团队
雷峰网
雷峰网
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
AWS News Blog
AWS News Blog
C
Cisco Blogs
美团技术团队
T
Threat Research - Cisco Blogs
C
CERT Recently Published Vulnerability Notes
人人都是产品经理
人人都是产品经理
宝玉的分享
宝玉的分享
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
酷 壳 – CoolShell
酷 壳 – CoolShell
Stack Overflow Blog
Stack Overflow Blog
W
WeLiveSecurity
D
DataBreaches.Net
博客园 - 司徒正美
Blog — PlanetScale
Blog — PlanetScale
IT之家
IT之家
云风的 BLOG
云风的 BLOG
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Simon Willison's Weblog
Simon Willison's Weblog
Google DeepMind News
Google DeepMind News
T
The Blog of Author Tim Ferriss
Know Your Adversary
Know Your Adversary
NISL@THU
NISL@THU
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
Vercel News
Vercel News
月光博客
月光博客
T
Tailwind CSS Blog
H
Help Net Security
aimingoo的专栏
aimingoo的专栏
P
Proofpoint News Feed
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Spread Privacy
Spread Privacy
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Cisco Talos Blog
Cisco Talos Blog
Microsoft Security Blog
Microsoft Security Blog
V
V2EX
WordPress大学
WordPress大学
Cyberwarzone
Cyberwarzone
Recent Announcements
Recent Announcements

博客园 - GDOUJKZZ

.net 8程序如何在信创的arm64架构下运行【nuget包如何判断能不能在arm架构跑呢】 【AI应用】【声纹识别】一、mini io 来构建高可用的文件存储方案 【AI】第五篇 大话说神经网络第一篇 docker 目录下的overlay2层的太多,导致占用大量占用磁盘空间怎么办呢。【docker目录清理】 【AI】第四篇 什么是神经网络 【AI】第三篇 RAG是什么 【AI】前置篇 Ai Agent的全貌概览 【AI】第二篇 为什么会有神经网络 【AI】第一篇 语言模型的前世 n-gram的简单介绍 【一】AI赋能 学习心态 从应用开发转到大数据开发 一分钟RequireJS介绍 .NET 6 在小并发下如何生成唯一单据号 垃圾回收机制简单理解 NPOI导出大量数据的避免OOM解决方案【SXSSFWorkbook】 递归有环问题解决方案 C# 使用NPOI处理Excel模板-【前面部分固定,中间是动态的几行,尾部是固定的部分】 高并发的场景下,如何保证生产者投递到消息中间件的消息不丢失
javascript里面的var let const关键字区别和使用
GDOUJKZZ · 2025-04-26 · via 博客园 - GDOUJKZZ

  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