在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 的一个重要区别。

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

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

  1. 微信小程序如何实现通过js修改wxml的for循环中的属性值

    微信小程序如何实现通过js修改wxml的for循环中的属性值 要实现的效果 具体代码 要实现的效果 点击每一个活动选项,实现显示对应的操作按钮 具体代码 首先要在对应页面的js中给data中定义数组, ...

  2. python中enumerate在for循环中用法_python中enumerate的用法实例解析

    在python中enumerate的用法多用于在for循环中得到计数,本文即以实例形式向大家展现python中enumerate的用法.具体如下: enumerate参数为可遍历的变量,如 字符串,列 ...

  3. List 列表中的对象在循环中的声明问题

    请看下面两段代码..MessageTopic对象建立的位置,直接导致了保存在List中MessageTopic对象的改变 第一段代码 public static List<MessageTopi ...

  4. linux中var的作用,linux中var是什么意思

    在搭建Kubernetes集群过程中,安装了kube-dns插件后,运行一个ubuntu容器,发现容器内无法解析集群外域名,一开始可以解析集群内域名,一段时间后也无法解析集群内域名. $ nslook ...

  5. JS中var和let区别

    1.let声明的变量是块级作用域(所在花括号里),var是函数作用域和全局作用域      注意:let是可以定义全局变量,局部变量,块级作用域的变量. 2.let声明的变量只在其声明的块或子块中可用 ...

  6. python 如何在一个for循环中遍历两个列表

    是我在看<笨方法学python>过程中发现有一行代码看不懂--" for sentence in snippet, phrase:",所以研究了半天,感觉挺有收获的.所 ...

  7. Js中var,let,const的区别

    一:区别: 1.var声明的变量属于函数作用域,而let和const声明的变量属于块级作用域:(js作用域在上篇文章) 2.var声明的变量存在变量提升,而let和const没有 3.var声明的变量 ...

  8. 7思妙想之Js 实现for循环中的停顿

    7思妙想之js 实现for循环中的停顿 与朋友在实现一次的web端的展示时,遇到了一个问题.先贴出有问题的代码: for(var i = 0; i < length; i++) {// code ...

  9. JS中for语句的循环的嵌套

    今天说一下JS中for语句的循环嵌套. for语句是JS中十分重要的循环语法. for(表达式1;表达式2;表达式3){for(表达式4;表达式5;表达式6){执行语句块儿}} 这是嵌套写法的基本结构 ...

最新文章

  1. 行为模式之Mediator模式
  2. Codeforce_732
  3. 携程Docker实践
  4. 解决centos下缺少sasl.h的问题(#include <sasl/sasl.h>)
  5. be my friend
  6. 3GPP Releases
  7. 常用的python模块
  8. 铁路售票系统_黑龙江一学生购买的火车票上惊现“学猪”字样!铁路部门给出回应...
  9. 吊打线段树的超级树状数组
  10. 《WinForm开发系列之控件篇》Item31 MenuStrip(暂无)
  11. Qt QT的I/O流 QT输入输出
  12. vue-froala-wysiwyg富文本编辑器
  13. python list 查找子列_寻找列表连续的子列
  14. numpy 随机生成矩阵
  15. 《操作系统真象还原》第十四章 ---- 实现文件系统 任务繁多 饭得一口口吃路得一步步走啊(上一)
  16. Angular:失焦校验和失焦方法冲突的解决方案 事件循环
  17. c++基础题:判断某整数是否既是5又是7的整数倍
  18. [附源码]Nodejs计算机毕业设计交通事故证据交易平台Express(程序+LW)
  19. 我上了一节小学AI课,发现四年级的小朋友不仅懂AI,还学会了写代码运行
  20. 2018传智黑马前端视频教程

热门文章

  1. 基本初等函数导数以及推导过程
  2. js 格式化日期yyyy-MM-dd hh:mm:ss
  3. ML之FE:机器学习算法/数据挖掘中特征选取(变量筛选)的简介、常用方法(单变量分析并筛选—Filter/Wrapper/Embedded、多变量间相关性分析并筛选—PCC/MIC/IV)之详细攻略
  4. html5设计礼品盒效果,十款眼前一亮的包装设计
  5. 【Spark基础练习题一】
  6. godot引擎学习9
  7. 波士顿大学 计算机专业,波士顿大学计算机专业录取
  8. C语言文本文件实现局部修改
  9. 达梦数据库培训学习学习心得
  10. win2000远程桌面工具使用mstsc.exe