var声明用来计数的循环变量泄漏为全局变量问题

【JS中var,let,const区别】 : / : 2. 变量提升 : / : 3. 重复声明 : / : 4. 修改值 : 基本类型(如 、)不可修改。 引用类型(如 、)可修改属性,但不能重新赋值。 三、使用建议 优先使用 : 适用于不会重新赋值的变量(如配置、常量)。 其次使用 : 适用于需要重新赋值的变量(如循环计数器)。 避免使用 : 除非在旧代码或特殊场景(如全局变量)。 四、经典问题示例 原因: 的 是全局共享的,而 的 是块级作用域,每次循环都是新的 阅读详情
问题描述:遍历a标签依次输出该标签的序号,结果3次都输出的是3,预期是0,1,2
   <ol>
        <li><a href="javascript:void(0);" class="clickBox">clickbox</a></li>
        <li><a href="javascript:void(0);" class="clickBox">clickbox</a></li>
        <li><a href="javascript:void(0);" class="clickBox">clickbox</a></li>
    </ol>
var clickBoxs = document.querySelectorAll('.clickBox')
for (var i = 0; i < clickBoxs.length; i++){
    clickBoxs[i].onclick = function(){
        console.log(i)
    }
}
问题本质:变量i用var声明,在全局范围内有效。所以每一次循环,新的i值都会覆盖旧的,导致最后输出的都是最后一轮的i的值。
解决方法一:闭包
function iteratorFactory(i) {
     return function(e) {
          console.log(i);
     }
}
var clickBoxs = document.querySelectorAll('.clickBox')
for (var i = 0; i < clickBoxs.length; i++){
    clickBoxs[i].onclick = iteratorFactory(i);
}
解决方法二:es6用let声明用来计数的循环变量
var clickBoxs = document.querySelectorAll('.clickBox')
for (let i = 0; i < clickBoxs.length; i++) {
    clickBoxs[i].onclick = function() {
        console.log(i)
    }
}
es6更优雅的写法:箭头函数
var clickBoxs = document.querySelectorAll('.clickBox')
for (let i = 0; i < clickBoxs.length; i++) {
    clickBoxs[i].onclick = () => console.log(i);
}

ES6与ES5声明变量补充:
1.ES5只有全局作用域和函数作用域,没有块级作用域,会导致两种常见的不合理场景:1)var声明的内层变量覆盖外层变量,例如:
var nickname = 'freedom';
{
    var nickname = 'victory';
    console.log(1, nickname);
}
console.log(2, nickname)
VM76:4 1 "victory"
VM76:6 2 "victory"
ES6解决方法:使用let的块级作用域避免变量提升
var nickname = 'freedom';
if(true) {
    let nickname = 'victory';
    console.log(1, nickname);
}
console.log(2, nickname)
VM97:4 1 "victory"
VM97:6 2 "freedom"
2)var声明用来计数的循环变量泄漏为全局变量,详细见前文。
2.ES6块级作用域变量声明的另外一个关键字const,用于声明常量
常用场景:引用第三方库声明的变量,避免未来重复命名或者重命名
例如:const os = require(‘os’);


深入解析JavaScript中var、let、const的作用域与变量提升 本文深入解析JavaScript中var、let、const的作用域与变量提升机制,详细对比三者在函数作用域、块级作用域、变量提升、重复声明等方面的区别。通过实际代码示例,揭示var的潜在问题及let/const的优势,提供现代JS开发的最佳实践建议,帮助开发者避免常见误区,编写更健壮的代码。 阅读详情

相关推荐

【Python基础】局部变量和全局变量的定义 || 局部变量的生命周期 || 全局变量的位置 || 使用全局变量的注意事项 || 修改全局变量的值 || 给全局变量命名的建议

Python基础学习,局部变量和全局变量的知识。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 520

变量作用域

将作用域的知识点串一下,多是JavaScript高级程序设计以及es6参考手册的汇总: ES5没有块级作用域: // 块级作用域,if语句中的变量声明会将变量添加到当前的执行环境(在这里是全局环境) if(true){ var color = 'red' } console.log(color) // red // 在使用for循环时尤其要牢记这一点 for(var i = 0;...

qq_35993607的博客 243

从零到一:Silvaco中跨导曲线的自动化脚本实现

本文详细介绍了如何使用Python脚本在Silvaco中实现跨导曲线(gm曲线)的自动化分析,包括数据加载、跨导计算和结果可视化。通过自动化处理Id-Vg曲线,显著提升半导体器件工程师的工作效率,特别适用于工艺优化和DOE分析。文章还提供了批量处理和关键参数提取的高级技巧,帮助工程师快速掌握Silvaco脚本开发。

nn3456的博客 568

ES6新特性----let基本用法、暂时性死区和变量提升的区别

ES6新增了let命令,用来声明变量。它的用法类似于var,但由它声明的变量,只在let命令所在的代码块内有效。

qq_44286009的博客 1190

新手必看:用Simulink搭建飞跨电容三电平逆变器的完整流程(附SPWM配置技巧)

本文详细介绍了使用Simulink搭建飞跨电容三电平逆变器(FCNPC)的完整流程,特别聚焦于SPWM调制策略的配置技巧。通过模块拆解、参数设置和波形优化的三步法,配合实操截图和典型参数表,帮助新手快速掌握多电平逆变器的建模与仿真技能,适用于电力电子学习和项目开发。

weixin_30664051的博客 285

父子Agent架构:解决AI系统上下文污染的技术方案

在AI系统设计中,上下文管理是核心挑战之一。传统单Agent架构在处理复杂任务时,常面临上下文无限膨胀导致的信息淹没和性能下降问题。父子Agent架构通过职责分离和上下文隔离机制,采用分而治之的思想,将大任务拆解为多个子任务由专门子Agent处理。该架构中父Agent负责任务规划和结果汇总,子Agent执行具体任务后立即销毁中间状态,通过精炼摘要进行通信。这种设计不仅能有效控制上下文长度,还能提升系统稳定性和执行效率,特别适用于编程辅助、自动化测试等需要多步骤处理的场景。父子Agent架构体现了计算机科学中

weixin_42531710的博客 353

let & const —— ES6基础总结(二)

前言 在JS中,var早已深入人心,因此本文将不再赘述,仅在必要时拉出来溜溜。 声明方式 变量提升 暂时性死区 重复声明 可修改值 块级作用域 全局变量属于顶层对象 var 是 否 是 是 否 是 let 否 是 否 是 是 否 const 否 是 否 否(引用类型仅保证地址不被修改) 是 否 变量提升 a // a is not defined l...

weixin_33758863的博客 384

LTspice仿真实战:共模电感差模/共模插入损耗测试全流程(附WE 744821201参数)

本文以Würth Elektronik 744821201型号共模电感为例,详细介绍了在LTspice中搭建差模与共模插入损耗测试电路的全流程。通过从规格书提取关键参数、构建SPICE模型,到执行仿真并与官方数据对比,旨在帮助硬件工程师在PCB设计前期精准预测EMC性能,弥合器件选型与系统设计之间的鸿沟。

info6的博客 761

渗透测试_会话管理

1、会话管理模式     攻击过程:cookie收集、cookie分析、cookie伪造。     分析cookie是否满足以下特点:不可预测性、防篡改、设置有效期、安全标志Secure。     cookie溢出。      2、cookie属性     Secure,httponly,domain,path,expires      3、会话固定     检查会话ID在验证成

blrk 1705

人形机器人骨骼材料选型实战:从铝合金到碳纤维的5种方案对比

本文深入探讨人形机器人骨骼材料的选型策略,对比铝合金、镁合金、钛合金、碳纤维复合材料及3D打印材料等5种方案的性能优劣。通过建立强度-重量比、疲劳寿命等核心评价维度,结合具体应用场景,提供科学的材料决策方法论,助力开发者优化机器人结构设计,实现性能与成本的平衡。

weixin_29199873的博客 440

openlayers:实现在连续更改时间维度时如何平滑地重新加载层 (附完整源码)

openlayers:实现在连续更改时间维度时如何平滑地重新加载层 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 348

for 循环变量泄露为全局变量

for(var i = 0; i &amp;lt; 3; i++) { console.log(1); // 0 1 2 } console.log(i); // 3 函数外的变量和函数里的局部变量的冲突,外部的全局变量会被函数里的局部变量覆盖 var i = 0; if(i &amp;lt; 3) { i++; console.log(i); // 1 if(i &amp;lt; 3) { ...

qq_37612114的博客 1433

24、汽车黑客技术全解析:诊断代码、车库创建与系统攻防

本文深入探讨了汽车黑客技术的核心内容,包括诊断代码模式与参数ID、创建开放车库社区、汽车系统相关技术、硬件与软件工具、攻击与防御手段,以及车辆通信与网络安全。无论你是汽车安全研究人员、爱好者还是开发者,都能从中获取全面的技术解析与实践指南。

Apple的专栏 228

JavaScript 变量声明:var vs let vs const详情

JavaScript变量声明方式对比:var存在函数作用域和变量提升问题,而ES6引入的let/const采用块级作用域,解决了重复声明和泄漏问题。const用于常量,let用于可变量,建议优先使用const并禁用var。关键区别在于作用域、重复声明、提升机制和赋值限制,合理选择声明方式能提升代码质量,避免常见错误。

白衣胜雪 628

PCL 计算点云AABB包围盒的体积【2026最新版】

AABB包围盒又称了 轴对齐包围盒,是点云包围盒里最简单的一种,其计算方法也极其简单。获取包围盒之后,根据包围盒的长宽高进行体积计算即可!博客长期更新,本文最近一次更新时间为:2026年5月3日。

点云侠的博客 2295

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

JavaScript 中的变量声明:var、let 与 const 的全面解析

在 JavaScript 的发展历程中,变量声明方式经历了从 `var` 到 `let` 和 `const` 的演变。这些关键字不仅影响代码的可读性,还深刻决定了变量的作用域、生命周期以及潜在的错误风险。本文将深入解析这三种声明方式的特性、使用场景及注意事项,助你写出更安全、更高效的 JavaScript 代码。

JakeMa1024的博客 888

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

前端JavaScript篇之浏览器的垃圾回收机制、哪些情况会导致内存泄漏

垃圾回收是指在 JavaScript 运行时自动回收不再使用的内存空间的一种机制。JavaScript 具有自动垃圾回收机制,会定期对那些不再使用的变量、对象所占用的内存进行释放,原理就是找到不再使用的变量,然后释放掉其占用的内存。

星辰迷上大海的博客 3235

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

let const var 声明变量

let

qq_45164496的博客 224

js 之变量声明 var 、let 、const 区别

var声明的变量为全局变量,并且会将该变量添加为全局对象的属性,但是,let和 const 不会。Let创建的变量是可以更改指针指向(即重新赋值),但const 声明的变量不允许改变指针的指向。在使用 let 和const 命令声明变量之前,该变量都是不可用的,这在语法上,称为暂时性死区。var存在变量提升,let和const 不存在变量提升,即变量只能申明之后使用,否则会报错。var 可以重复声明变量,后声明的同名变量会覆盖之前声明的变量,const和let 不允许。* 内层变量可能覆盖外层变量。

qq_53165476的博客 183

js内存泄漏及排查详解

js内存泄漏及排查详解

qq_42880714的博客 5581

导致JS内存泄漏的几种情况

内存泄漏是开发中很常见的问题,即使使用具有自动管理内存的语言,也有可能出现内存泄漏的情况,内存泄漏可能会引起变慢、延迟、崩溃等问题。要解决内存泄漏问题,首先要弄懂什么是内存泄漏,什么情况下会导致内存泄漏。这样,当出现内存泄漏时才知道如何应对。什么是内存泄漏?内存泄漏是指不再用到的内存,没有及时释放。既不能使用,又不能回收。程序的运行需要内存。对于持续运行的进程,如果不及时释放不再用到的内存,内存占用

meijory的博客 5058

内存泄漏问题总结

1、内存的生命周期   无论你使用那种语言,内存的生命周期基本是都差不多:分配内存 —— 使用内存 —— 释放内存,以下是生命周期中每一步发生了什么的一个概述:   Allocate memory —— 操作系统分配内存,允许你的程序使用它。在基础语言中(例如 C ),这是一个开发者自己处理的明确操作。然而,在高级语言中,它已经为你处理了。   Use memory —— 现在你就...

weixin_30823001的博客 289

js中的内存泄漏

内存泄漏一般是指变量的内存没有及时的回收,导致内存资源浪费。一般有三种情况出现内存泄露比较多。(1)常见的声明了一个全局变量,但是又没有用上,那么就有点浪费内存了,(2)定时器没清除 (3)循环引用:

qq_54591762的博客 3553

JavaScript 内存泄漏教程

一、什么是内存泄漏? 对于持续运行的服务进程(daemon),必须及时释放不再用到的内存。否则,内存占用越来越高,轻则影响系统性能,重则导致进程崩溃。 不再用到的内存,没有及时释放,就叫做内存泄漏(memory leak)。 有些语言(比如 C 语言)必须手动释放内存,程序员负责内存管理。 char * buffer; buffer = (char*) malloc(42); // Do som...

u013321328的专栏 710

JavaScript内存泄漏

并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。进入环境的变量所占用的内存就不能释放,当变量离开环境时,则将其标记为“离开环境“垃圾回收程序运行的时候,会标记内存中存储的所有变量。然后,它会将所有在上下文中的变量,以及被在上下文中的变量引用的变量的标记去掉。这很麻烦,所以大多数语言提供自动内存管理,减轻程序员的负担,这被称为"垃圾回收机制"程序的运行需要内存。语言中,因为是手动管理内存,内存泄露是经常出现的事情。

dd的博客 841

浏览器的内存回收机制&监控内存泄漏

在浏览器中,每个网页或Web应用程序都占用了一定的内存。内存管理的主要目的是分配和释放内存,确保应用程序平稳运行,而不会消耗过多资源或崩溃。浏览器的内存管理包括两部分:现代浏览器都使用自动化的内存回收机制,其中最核心的部分是垃圾回收(Garbage Collection,简称GC)。垃圾回收的核心目标是自动回收那些不再被引用的对象所占用的内存资源。具体来说,浏览器的垃圾回收机制主要基于以下两种策略:引用计数是一种简单的垃圾回收算法,它为每个对象维护一个引用计数器,表示有多少个其他对象引用了它。当一个对象的引

Flying_Fish_roe的博客 2232
上一篇: 浅谈display:flex
下一篇: Writing for GCD: 如何将github repository 部署到GitHub pages
freedom1993
博客等级 码龄12年 25粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值