关于js中 var在for循环中出现错误的问题思考
在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循环中出现错误的问题思考相关推荐
- 微信小程序如何实现通过js修改wxml的for循环中的属性值
微信小程序如何实现通过js修改wxml的for循环中的属性值 要实现的效果 具体代码 要实现的效果 点击每一个活动选项,实现显示对应的操作按钮 具体代码 首先要在对应页面的js中给data中定义数组, ...
- python中enumerate在for循环中用法_python中enumerate的用法实例解析
在python中enumerate的用法多用于在for循环中得到计数,本文即以实例形式向大家展现python中enumerate的用法.具体如下: enumerate参数为可遍历的变量,如 字符串,列 ...
- List 列表中的对象在循环中的声明问题
请看下面两段代码..MessageTopic对象建立的位置,直接导致了保存在List中MessageTopic对象的改变 第一段代码 public static List<MessageTopi ...
- linux中var的作用,linux中var是什么意思
在搭建Kubernetes集群过程中,安装了kube-dns插件后,运行一个ubuntu容器,发现容器内无法解析集群外域名,一开始可以解析集群内域名,一段时间后也无法解析集群内域名. $ nslook ...
- JS中var和let区别
1.let声明的变量是块级作用域(所在花括号里),var是函数作用域和全局作用域 注意:let是可以定义全局变量,局部变量,块级作用域的变量. 2.let声明的变量只在其声明的块或子块中可用 ...
- python 如何在一个for循环中遍历两个列表
是我在看<笨方法学python>过程中发现有一行代码看不懂--" for sentence in snippet, phrase:",所以研究了半天,感觉挺有收获的.所 ...
- Js中var,let,const的区别
一:区别: 1.var声明的变量属于函数作用域,而let和const声明的变量属于块级作用域:(js作用域在上篇文章) 2.var声明的变量存在变量提升,而let和const没有 3.var声明的变量 ...
- 7思妙想之Js 实现for循环中的停顿
7思妙想之js 实现for循环中的停顿 与朋友在实现一次的web端的展示时,遇到了一个问题.先贴出有问题的代码: for(var i = 0; i < length; i++) {// code ...
- JS中for语句的循环的嵌套
今天说一下JS中for语句的循环嵌套. for语句是JS中十分重要的循环语法. for(表达式1;表达式2;表达式3){for(表达式4;表达式5;表达式6){执行语句块儿}} 这是嵌套写法的基本结构 ...
最新文章
- 行为模式之Mediator模式
- Codeforce_732
- 携程Docker实践
- 解决centos下缺少sasl.h的问题(#include <sasl/sasl.h>)
- be my friend
- 3GPP Releases
- 常用的python模块
- 铁路售票系统_黑龙江一学生购买的火车票上惊现“学猪”字样!铁路部门给出回应...
- 吊打线段树的超级树状数组
- 《WinForm开发系列之控件篇》Item31 MenuStrip(暂无)
- Qt QT的I/O流 QT输入输出
- vue-froala-wysiwyg富文本编辑器
- python list 查找子列_寻找列表连续的子列
- numpy 随机生成矩阵
- 《操作系统真象还原》第十四章 ---- 实现文件系统 任务繁多 饭得一口口吃路得一步步走啊(上一)
- Angular:失焦校验和失焦方法冲突的解决方案 事件循环
- c++基础题:判断某整数是否既是5又是7的整数倍
- [附源码]Nodejs计算机毕业设计交通事故证据交易平台Express(程序+LW)
- 我上了一节小学AI课,发现四年级的小朋友不仅懂AI,还学会了写代码运行
- 2018传智黑马前端视频教程
热门文章
- 基本初等函数导数以及推导过程
- js 格式化日期yyyy-MM-dd hh:mm:ss
- ML之FE:机器学习算法/数据挖掘中特征选取(变量筛选)的简介、常用方法(单变量分析并筛选—Filter/Wrapper/Embedded、多变量间相关性分析并筛选—PCC/MIC/IV)之详细攻略
- html5设计礼品盒效果,十款眼前一亮的包装设计
- 【Spark基础练习题一】
- godot引擎学习9
- 波士顿大学 计算机专业,波士顿大学计算机专业录取
- C语言文本文件实现局部修改
- 达梦数据库培训学习学习心得
- win2000远程桌面工具使用mstsc.exe