js for 循环中的 变量问题。
今日处理项目中的一个循环,本来就是一个小小的for循环,后来发现该段程序出现了问题,仔细检查代码没有发现其中的错误。无奈只好叫来了老大帮忙。通过在模版中断点调试(该方式只能自己写debugger断点)我们找到了问题的所在。首先看我们的循环:
for(var i =0, len = arr.length; i<len; i++){
console.log(arr[i]);
for(var i=0; i<x.length; i++) {
console.log(x[i]);
}
}
这是一个很简单的嵌套循环,但问题出在这里。我们在第一个for循环内定一个变量I,同时在第二个循环中也定义了同名的i,根据老大的说法是: 第二个i是局部变了,它的定义不影响外层的i。但是,经过调试,结果与他说的完全相反。无论是第一个for循环中的i或者第二个循环中的i都是同一个全局变量,所以第二个循环中的变量将第一个i覆盖了!!!.也就是说for()循环中的作用域是全局的,是指向父级,并不是像function一样创造了一个独立的环境。为了证实这个说法,我们可以写下列例子。
for(var i =0; i<5; i++){
console.log(i);
for(var i=0; i<8; i++) {
console.log(i);
}
}
可以在浏览器中看到他连续输出一段数字:

第一个0是外层的for输出的,接下来所有的数字都是里面那层for循环输出的。可以看到,外层只循环了一次,这是因为在里面那个关键字i循环过后被复制为8,那么当外面那层做第二循环的时候会对比条件i<5,显然,此时该条件已经不满足了,外层就不会再循环了。但是还是会执行一下i++,最后,i就成了9.
一个很小的问题,被困住了将近半个小时,幸好有老大指点。所以以后大家在做多重循环的时候就要注意这个问题了。
js for 循环中的 变量问题。的更多相关文章
- 【SQL】小心在循环中声明变量——浅析SQL变量作用域
本文适用:T-SQL(SQL Server) 先看这个语句: --跑3圈 BEGIN --每圈都定义一个表变量,并插入一行 DECLARE @t TABLE(Col INT PRIMARY KEY) ...
- 用闭包解决 js 循环中函数变量暂存问题
需求:有一个数组,根据数组的值渲染对应的数字div,单击对应的div 在控制台打印对应的数字.如点击1,控制台打印1. 问题: 不管点击哪个值 打出来都是4 代码如下 <!DOCTYPE htm ...
- js for循环中定义clike事件由于闭包导致的循环变量获取不到的问题
在网上找的 记下来以备不时之需 案例; 本人有一个数组按钮 循环数组按钮 给每个按钮添加click事件 原本以为搞定但是出现了 每个按钮都是数组最后的方法 然后查找问题 发现onclike事件中的i ...
- for循环中的变量泄漏
经典的案例 let arr = [] for(var i =0;i<=5;i++){ arr[i]= function fn(){ console.log(i) } } arr[0]() //6 ...
- JS(面试中的变量类型和计算问题)
JS(变量类型和计算) 题目1.JS 中使用 typeof 能得到那些类型? 题目2.何时使用 === 何时使用==? 题目3.JS 中有哪些内置函数? 题目4.JS 变量按照存储方式区分为那些类型, ...
- Python语言程序设计之一--for循环中累加变量是否要清零
最近学到了Pyhton中循环这一章.之前也断断续续学过,但都只是到了函数这一章就停下来了,写过的代码虽然保存了下来,但是当时的思路和总结都没有记录下来,很可惜.这次我开通了博客,就是要把这些珍贵的学习 ...
- 16.1 foreach 循环中捕获变量的变化
在 foreach 循环内的匿名函数(通常为Lambda表达式)中捕获循环 变量时要格外小心.代码清单16-1就展示了这样一个简单的示例,它看上去似乎会输出 x . y . z . string[] ...
- JS调用C#中的变量
今天早上做项目,需要使用JS来得到数据库里面表的行数.经过查找资料,知道可以使用在C#中定义一个全局变量.在JS中调用即可,自己总结一下:供日后参考; public string Str() { st ...
- js循环函数中的匿名函数和闭包问题(匿名函数要用循环中变量的问题)
js循环函数中的匿名函数和闭包问题(匿名函数要用循环中变量的问题) 一.总结 需要好好看下面代码 本质是因为匿名函数用到了循环中的变量,而普通方式访问的话,匿名函数的访问在循环之后,所以得到的i是循环 ...
随机推荐
- hash 表 | | jzoj 1335 | | 脑残+手残 | | 集合的关系
给定两个集合A.B,集合内的任一元素x满足1 ≤ x ≤ 10^9,并且每个集合的元素个数不大于10^5.我们希望求出A.B之间的关系. 给定两个集合的描述,判断它们满足下列关系的哪一种:A是B的一个 ...
- Ubuntu 16 安装odoo10 实录
安装Ubuntu 16,省略 安装时,默认用户名为 odoo ubuntu 16开始 使用 systemd 管理服务,但是systemd 兼容 sysv init 脚本 下载 odoo源码 从 htt ...
- vim的撤销和恢复操作以及匹配当前单词操作
今天顺便看了一下vim的一点命令,记录一下 1.撤销上一次操作和恢复上一次操作: u → undo <C-r> → redo 2.搜索上一个单词和下一个单词 * 和 #: 匹配光标当前所在 ...
- echarts绘制甘特图
在setoption之后添加这段代码: window.addEventListener('resize', function () { myChart.resize(); }); 图表就能随着 ...
- Mac下U盘安装系统“未验证的错误”
bash下 输入下面命令: date 1220141012015.30
- 程序猿,千万别说你不了解Docker!
放在两年前,你不认识Docker情有可原.但如果现在你还这么说,不好意思,我只能说你OUT了.你最好马上get起来,因为有可能你们公司很快就会引入Docker. 今天就和大家讨论讨论这个备受好评的应用 ...
- C# Susan边缘检测(Susan Edge Detection)
Susan边缘检测,方法简单,效率高,具体参照 The SUSAN Edge Detector in Detail, 修改dThreshold值,可以改变检测效果,用参照提供的重心法.力矩法可得到边缘 ...
- jquery修改table某列的值
开发的过程中,我们经常会遇到一些数和值之间的转换,比如本例:学部:1.小学,2.初中,3.高中;当然实现方法很多种,可以后台代码,也可以使用脚本... 修改前: 修改后: 代码: $("#t ...
- 检查或遍历android手机应程
检查android手机中是否存在某应程 public boolean checkApp(String packageName) { if (packageName == null || ...
- luogu p1268 树的重量——构造,真正考验编程能力
题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...