关于js中 var在for循环中出现错误的问题思考

本文探讨了ES6中let和const引入的块级作用域对循环的影响,解释了为何在for循环中使用var可能导致意外的结果。通过实例分析,展示了var声明的变量在循环中共享同一作用域,而let则在每次循环中创建新的作用域,从而避免了变量污染。总结了let和var在循环中使用的主要差异,强调了理解块级作用域的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在es6的let const出现前,使用 for(var i=0;i<n;i++) 这种循环方式可能会出现问题,如图所示

个人理解:

在使用单步调试时发现

使用var声明时,js编译器会先var i=0,执行i<3判断,将值放入循环体内,然后执行i++自增

每次循环都会将function push到a这个数组内,循环结束后,a为三个function的数组

        a[2]() return 的 i 实际上使用的是循环时var的 i,由于var的作用域问题,在循环时操作的 i 实际上是同一个,这就导致此处在获取 i 时实际上并不是获取的数组的下标1,而是获取的var的 i 的值,由于此时var的 i 的值等于3( 因为在循环体内循环的时候,i 经历了由0-2后再次执行了i++,此时i为3,且通不过i<3的判断,因而var 的 i 实际上的最终值为3 ),所以不论数组下标为多少,始终输出为 3。     

        而在let i 时,在每次执行循环时i实际上在一个块级作用域内,在每个块级作用域内 i 的值已经被固定下来,此时的a数组中的每个function实际上return的是他们块级作用域的 i ,所以在a[2]()时实际上return的 i 与数组下标依旧没有关系,之所以return的 i 是 2 ,是因为在a[2]()这个funtion的块级作用域内,i 的值为2,所以输出时为2。

总结一下:        

        个人认为,在理解这个问题时,不能认为调用a[2]()这个function时,i 的值为数组下标,否则就会陷入误区,实际上在数组的每个function内,return的 i 与数组下标没有关系,return 的 i 主要取决于在a[2]()这个函数作用域内的 i 的值,var 时 ,i 在每次循环时都操作的同一个,可以类比为一个全局变量,所以在 return 时调用的 i 也是同一个。let 则会将 i 化为块级作用域内的局部变量,每次return 的 i 实际上并不是同一个,这也是 let 和 var 的一个重要区别。

        全文为个人观点,如果有不合适或者有错误的地方欢迎大家评论指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值