一、保留i值 

通常情况下,因为一些效果我们需要获取到for循环中的i的值,但是往往拿到的都是最后一个i的值。下面介绍几种方法可以获取到i的值

1.自定义属性:

arr[i].index = i;

以一个事件为例

例如:

for(var i =0;i<arr.length;i++){
arr[i].index = i;
arr[i].onclick = funtion(){
var index = this.index;
console.log(index)  //  ===>1,2,3,4

}

}

2 自执行函数:

for(var i=0;i<5;i++){
(function(n){

setTimeout(function(){

console.log(n);

},1000)

})(i)}

==>0,1,2,3,4
3 闭包:
var list =document.querySelectorAll("ul>li");
for(var i=0;i<list.length;i++){
list[i].onclick=function(i){
return function(){
    console.log(i)
    }
    }(i);
}
4 使用ES6语法中的let代替var关键字:
var list =document.querySelectorAll("ul>li");
for(let i = 0 ; i < list.length ; i++) {
    list[i].onclick=function(){
    console.log(i)
    }
}

==>0,1,2,3

推荐链接:https://www.cnblogs.com/shipskunkun/p/5695784.html

二、延时器保留i值的方法

1.  先看一个经典的for循环嵌套延时器的案例

; i < lg; i++) {// lg = 6

setTimeout(function () {
console.log(i); //此时输出为 6 个 6
}, )
}
我们想要的结果是在for循环中一次打印出 i 的 值。即0,1,2,3,4,5;但是输出6个相同的个数字是什么原因呢?

这主传进去要是因为setTimeout的执行时异步执行的,而for循环的执行却非常的快,所以,在1s后执行定时器函数时, i  已经 循环到了最大值6,其他的i值已经被销毁,此时再执行定时器,则是把 i=6传进去了,所以造成了这样的结果。 

第一种方法:将延时器中的函数用一个自执行函数包起来,把每个循环中的 i 在被回收之前直接传入到自执行函数中,这样就可以避免被回收:如下:

; i < lg; i++) {//lg = 6
setTimeout((function (a) {
console.log(a);//操纵变量a,和i无关 此时输出为0,1,2,3,4,5
})();//将 i 作为变量传入
}
但是这样写会出现一个问题,函数直接打印了,并没有一秒的延迟,原因是将自执行函数放在定时器中,会直接执行,并不是1秒后再执行,所以在这种方法上做了一些改进,即第二种方法:
第二种方法:将延时器整个的包裹在一个子执行函数中,这样就相当于同时定义了6个延时1s的延时器:
; i < lg; i++) {//lg = 6
(function (a) {//自执行函数,获取i
setTimeout(function () {
console.log(a);//操纵变量a,和i无关 此时输出为 0,1,2,3,4,5 且在1s延迟后输出
}, )
})(i)
}

第三种方法:因为ES6的let会在局部作用域内保留i值

; ; i++) {
setTimeout(function () {
console.log(new Date, i);
}, );
}

这样就完美的解决问题了;如果你想要每隔一秒输出一个值,而不是同时输出,则可以将参数传进时间中:

; i < lg; i++) {//lg = 6
(function (a) {//自执行函数,获取i
setTimeout(function () {
console.log(a);//操纵变量a,和i无关 此时输出为 0,1,2,3,4,5 且在1s延迟后输出
}, )//将 i 的值传进来 ,这样就可以每个一秒输出一个值
})(i)
}

setInterval定时器和setTimeout 不同,因为是执行次数的原因,不能将 i  的值传进时间中,会造成多次重复;

深入浅出:了解for循环中保留i值得方法的更多相关文章

  1. 从集合中查找最值得方法——max(),min(),nlargest(),nsmallest()

    从集合中查找最值得方法有很多,常用的方法有max(),min(),nlargest(),nsmallest()等. 一.max()和min() 1.1 入门用法 直接使用max(),min(),返回可 ...

  2. Javasrcipt中从一个url或者从一个字符串中获取参数值得方法

    从url中获取参数值是che程序开发过程中的常用需求,偶然得闲,便抽空研究了一下javasrcipt下,获取参数的办法(JAVA中也类似). 首先看url的规范: URL组成:protocol :// ...

  3. java、el表达式中保留小数的方法

    Java中: import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; p ...

  4. JAVA中保留指定小数位方法

    import java.math.BigDecimal;    import java.text.DecimalFormat;    import java.text.NumberFormat;    ...

  5. C语言循环中降低推断——————【Badboy】

    为了让编译器更好地优化循环,应该尽量让循环中降低推断,方法之中的一个是将推断语句整合进表达式.还是这个样例: for (int i = 0; i < 1000*10; i++) { sum += ...

  6. spring中for循环中事务

    1.需求:批量插入一批数据,不用spring jdbc的批处理,用for循环插入数据. 2.遇到的问题:在for循环中,当一个插入不成功,前面插入成功的数据也将回滚. 3.初始设计:在service中 ...

  7. Apex 小知识:SOQL 在循环中的应用

    两种在循环中引用 SOQL 的方法 第一种方法: List<Account> accounts = [SELECT Id FROM Account WHERE NumberOfEmploy ...

  8. 深入理解JavaScript的闭包特性如何给循环中的对象添加事件

    初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...

  9. js模版引擎handlebars.js实用教程——循环中使用索引

    <!DOCTYPE html> <html> <head> <META http-equiv=Content-Type content="text/ ...

随机推荐

  1. xcode定期清理记录一下

    此文章仅适用于适用于使用Xcode的开发者. 长期不清理Xcode中的一些文件你会发现自己的mac硬盘越来越小,而且是这个其他占了绝大部分的硬盘,在网上搜索了很多办法都没找到如何清理这些其他 后来来来 ...

  2. JavaScript高级程序设计第三版-读书笔记(1-3章)

    这是我第一次用markdown,也是我第一次在网上记录我自己的学习过程. 第一章 JavaScript主要由以下三个不同的部分构成 ECMAScript   提供核心语言功能 DOM     提供访问 ...

  3. centos7.3下配置本地yum仓库

    部署openstack时,网络yum源安装慢,而且经常中的提示找不到mirrors,所以配置一个本地的安装源很有必要,来解决这个揪心的问题. 安装:yum install yum-utils crea ...

  4. BZOJ 3796 Mushroom追妹纸 哈希+二分(+KMP)

    先把两个串能匹配模式串的位置找出来,然后标记为$1$(标记在开头或末尾都行),然后对标记数组求一个前缀和,这样可以快速查到区间内是否有完整的一个模式串. 然后二分子串(答案)的长度,每次把长度为$md ...

  5. 【ACM】括号配对问题 - 栈

    括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 现在,有一行括号序列,请你检查这行括号是否配对.   输入 第一行输入一个数N(0<N<=1 ...

  6. phpcms Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE错误

    我在phpcms的模板中自定义了一个变量,变量的值是通过pc标签赋予的. <?php $url="{$v[url]}"; ?> 结果报如上错误. 实际上应把PHP语句改 ...

  7. Unity C# 脚本的单例

    今天学习了一个比较不错的单例模式 public class UnitySigleton <T>: MonoBehaviour where T:class { public static T ...

  8. 记DotNetBar换肤

    界面: comboBoxEx  选择皮肤 buttonX 测试指定皮肤 styleManager 后台代码: 初始化 : this.EnableGlass = false; 设置窗体效果 不设置 依然 ...

  9. 阐述简称PO,VO,TO,BO,DAO,POJO

    PO(persistant object) 持久对象 在o/r映射的时候出现的概念,如果没有o/r映射,没有这个概念存在了.通常对应数据模型(数据库),本身还有部分业务逻辑的处理.可以看成是与数据库中 ...

  10. Teradata 认证系列 - 3. 关系型数据库的概念

    本课的学习目标 定义关系型数据库关联的术语 讨论主键的功能 讨论外键的功能 列出关系型数据库的优势 描述星型架构和第三范式数据模型的区别 什么是数据库?数据库是一个应用永久保存数据的集合表现在: 逻辑 ...