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

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - GDOUJKZZ

.net 8程序如何在信创的arm64架构下运行【nuget包如何判断能不能在arm架构跑呢】 【AI应用】【声纹识别】一、mini io 来构建高可用的文件存储方案 【AI】第五篇 大话说神经网络第一篇 docker 目录下的overlay2层的太多,导致占用大量占用磁盘空间怎么办呢。【docker目录清理】 【AI】第四篇 什么是神经网络 - GDOUJKZZ 【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