js for循环中的i使用var和let有什么区别?

简介: js for循环中的i使用var和let有什么区别?

目录


先来个简单的测试


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

会发现var和let作为循环的执行输出貌似没什么问题。

是不是就没有区别呢?

当然不是!

变量提升


  1. 相信很多人都知道var有变量提升的问题
  2. 我们猜想如果var导致i提升了,那么用var声明的i会成为window全局的变量。
  for (var i = 0; i < but.length; i++) {
    console.log(i)//0 1 2
  }

代码就相当于i提升到了全局上,循环时用的都是同一个window.i的值

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


我们可以做个对照,let声明的i拥有了自己的块级作用域,每次循环的i只在当前循环有效,第一次声明i=0、第二次i=1、。

  for (let i = 0; i < but.length; i++) {
    console.log(i)// 0 1 2
    console.log(window.i)//undefined undefined undefined
  }
  console.log(i)//undefined

问题场景



给按钮添加事件,我们希望按钮输出自己的下标值i和它的内容值。


结果是点击什么都是3,因为var声明的i不具备块级作用域,这里点击事件中的i读取不到这个for循环中的i,只能获取到window上的i,而这个i是最后的值,也就是跳出for循环的but.length,为3。

<body>
    <button>0</button>
    <button>1</button>
    <button>2</button>
</body>
<script>
  const but = document.getElementsByTagName('button')
  for (var i = 0; i < but.length; i++) {
    but[i].onclick = () => {
      console.log('点击的button的下标:' + i)//3 3 3 
    }
  }
</script>

换成let试试

<body>
    <button>1</button>
    <button>2</button>
    <button>3</button>
</body>
<script>
  const but = document.getElementsByTagName('button')
  for (let i = 0; i < but.length; i++) {
    but[i].onclick = () => {
      console.log('点击的button的下标:' + i)//0 1 2
    }
  }
</script>


相关文章
|
1月前
|
JavaScript 前端开发
js循环有几种
js循环有几种
32 0
|
15天前
|
设计模式 JavaScript 前端开发
js中new和object.creat区别
【10月更文挑战第29天】`new` 关键字和 `Object.create()` 方法在创建对象的方式、原型链继承、属性初始化以及适用场景等方面都存在差异。在实际开发中,需要根据具体的需求和设计模式来选择合适的方法来创建对象。
|
16天前
|
JavaScript
js动画循环播放特效源码(上班族的一天)
js动画循环播放特效是一段实现了包含形象的卡通小人吃、睡、电脑工作的网页动画,js循环动画,简单的画面设计。非常丝滑有意思,欢迎对此代码感兴趣的朋友前来下载参考。
26 2
|
1月前
|
存储 JavaScript 前端开发
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法
JavaScript 数据类型分为基本数据类型和引用数据类型。基本数据类型(如 string、number 等)具有不可变性,按值访问,存储在栈内存中。引用数据类型(如 Object、Array 等)存储在堆内存中,按引用访问,值是可变的。本文深入探讨了这两种数据类型的特性、存储方式、以及检测数据类型的两种常用方法——typeof 和 instanceof,帮助开发者更好地理解 JavaScript 内存模型和类型检测机制。
71 0
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法
|
1月前
|
存储 JavaScript 前端开发
js中函数、方法、对象的区别
js中函数、方法、对象的区别
16 2
|
1月前
|
JavaScript 前端开发
【JavaScript】let,const和var的区别
总的来说,随着ECMAScript 6(ES6)及后续版本的推广,`let`和 `const`因其增强的块级作用域和对变量行为的更严格控制,逐渐成为现代JavaScript编码实践中推荐使用的变量声明方式。而 `var`由于其历史遗留的局限性,正逐渐被边缘化,但在维护老代码或处理特定兼容性需求时仍需了解。
35 3
|
2月前
|
JavaScript 前端开发
JavaScript中单引号和双引号的效果的一点区别
JavaScript中单引号和双引号的效果的一点区别
|
1月前
|
JavaScript
自动循环提交js
自动循环提交js
17 0
|
JavaScript 前端开发
在JavaScript中使用var和不使用var变量的区别
在JavaScript中使用var和不使用var变量的区别
113 0
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
96 2