for循环中使用let跟var的区别

本文详细探讨了JavaScript中for循环里let和var声明变量的区别,特别是在异步执行函数中的表现。let避免了变量提升问题,确保每次迭代的变量独立,而var可能导致变量污染。通过示例展示了在setTimeout等异步场景下,let如何保证每个定时器函数拥有各自的变量副本,防止输出结果被覆盖。同时提到了使用闭包解决var在循环中的问题,以确保正确输出。

for循环中使用let跟var的区别

一般情况下var和let并没有太大区别,如果就是一个普通的循环且无太多需求的话
例如:

for(var i = 0; i < 3; i++){
    console.log(i)   // 0 1 2
}

for(let i = 0; i < 3; i++){
    console.log(i)   // 0 1 2
}

若果内部有异步执行函数的话,那么选择let就比选择var要好
例如:

 for (var i = 0; i < 3; i++) {
      setTimeout(function () {
        console.log(i) // 3s 后输出 3 次 3 (不理解的把for后面的括号当做一个作用域看) 
      }, 3000)
      console.log(i) // 先输出 0 1 2
    }
    
 for (let i = 0; i < 3; i++) {
      setTimeout(function () {
        console.log(i)// 3s 后输出 0 1 2
      }, 3000)
      console.log(i) // 先输出 0 1 2
    }

这是因为setTimeout是异步执行,每一次for循环的时候,setTimeout都执行一次,但是里面的函数没有被执行,而是被放到了任务队列里,等待执行。只有主线上的任务执行完,才会执行任务队列里的任务。也就是说它会等到for循环全部运行完毕后,才会执行fun函数,但是当for循环结束后此时i的值已经变成了3,因此虽然定时器跑了5秒,控制台上的内容依然是3。

同时因为for循环头部的let不仅将i绑定到for循环中,事实上它将其重新绑定到循环体的每一次迭代中,确保上一次迭代结束的值重新被赋值。setTimeout里面的function()属于一个新的域,通过var定义的变量是无法传入到这个函数执行域中的,通过使用let来声明块变量能作用于这个块,所以function就能使用i这个变量了;这个匿名函数的参数作用域和for参数的作用域不一样,是利用了这一点来完成的。这个匿名函数的作用域有点类似类的属性,是可以被内层方法使用的。

最后呢 使用var声明的变量会存在变量提升的问题,而使用let就不存在变量提升的问题。如果非要使用var当做循环循环头的话,出现循环后打印出的结果一模一样的问题,可以使用闭包来解决

for (var i = 0; i < 3; i++) {
        function name1() {
            var j = i  //此处声明变量用什么都行并不影响结果,推荐使用let和const
            function jj() {
                console.log(j, "var");
            }
            return jj   //必须return出去,不然此函数无法被外部调用
        }
        var func = name1()
        func()
    }
// 0 1 2 
    
// 这是立即执行函数的写法 
for (var i=1; i<3; i++) {
    (function(j) {
        setTimeout( function timer() {
            console.log( j );
        }, j*1000 );
    })(i);
}
// 0 1 2 

通过闭包,将i的变量驻留在内存中,当输出j时,引用的是外部函数的变量值i,i的值是根据循环来的,执行setTimeout时已经确定了里面的的输出了。

Gemini科研手册指南.内容概要:本文介绍了《Gemini科研手册指南》,通过系统化的提示词设计与智能体协同工作流,帮助科研人员高效完成从选题生成、文献检索、精读分析、综述撰写到科研绘图、数据可视化及汇报PPT制作的全流程。手册特别强调Gemini在“研究方案先行”“方案可修订”“面向研究目标的结构化输出”等方面的优势,支持基于真实科研逻辑开展可追溯、可复用、可迭代的研究工作。其核心功能覆盖学术热点与产业趋势交叉分析、高可信文献检索、多篇论文横向对比、机制图与数据图智能生成,并深度融合多模态理解与代码执行能力,实现“描述即生成”的科研辅助体验。; 适合人群:科研新手、硕士/博士研究生、青年科研工作者及需快速切入前沿领域的跨学科研究者;尤其适用于希望提升科研效率、规范研究流程、增强成果可视化表达能力的研究人员。; 使用场景及目标:①快速锁定兼具学术新颖性与产业牵引力的研究方向;②系统性开展文献综述,避免泛化罗列,支持研究路径迭代;③精准生成符合期刊要求的机制图、数据图与技术路线图;④构建从数据到图表再到汇报材料的一体化输出流程;⑤提升科研写作的逻辑性、结构化与学术规范性。; 其他说明:该手册提供大量可直接复用的提示词公式与操作示例,支持与Canvas、Nano Banana等智能体协同,实现从文本指令到高质量科研产出的闭环;建议用户结合自身研究主题灵活调整提示词结构,并充分利用100万token上下文窗口处理大批量文献与复杂任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值