var是ES5定义变量的一种声明方式,一直听说var声明变量,存在循环变量泄漏为全局变量问题,但总是想不明白这个“全局”有什么影响,还有,到底什么时候输出的结果是递增/减的值,什么时候输出一样的值,也不清楚。
问题复现for (var i = 1; i <= 5; i++) { setTimeout(function timer() { console.log(i) }, i * 1000)}
预期效果:12345
打印结果:66666
解决方式闭包
for (var i = 1; i <= 5; i++) { (function (j) { setTimeout(function timer() { console.log(j) }, j * 1000) })(i)}
setTimeout 第三参数
for (var i = 1; i <= 5; i++) { setTimeout( function timer(j) { console.log(j) }, i * 1000, i )}
使用 let 定义 i
for (let i = 1; i <= 5; i++) { setTimeout(function timer() { console.log(i) }, i * 1000)}let
关于let,记住:当前的i只在本轮循环有效,每一次循环的i其实都是一个新的变量。
JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。
另外,for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。
for (let i = 0; i < 3; i++) {let i = ’abc’;console.log(i);}// abc// abc// abc总结
到此这篇关于var使用for循环遇到的问题解决的文章就介绍到这了,更多相关var for循环问题内容请搜索优爱好网以前的文章或继续浏览下面的相关文章希望大家以后多多支持优爱好网!
相关文章:
1. 怎么让div+css兼容ie6ie7ie8ie9和FireFoxChrome等浏览器2. requestAnimationFrame使用示例详解3. 基于JavaScript实现图片裁剪功能4. React优雅的封装SvgIcon组件示例5. uniapp自定义验证码输入框并隐藏光标6. 详解JavaScript中原始数据类型Symbol的使用7. JavaScript深拷贝方法structuredClone使用8. uniapp 手机验证码输入框实现代码(随机数、倒计时、隐藏手机号码中间四位)可以直接使用9. 使用Node.js实现Clean Architecture方法示例详解10. Jquery使用原生AJAX方法请求数据