解决for循环里获取到的索引是最后一个的问题
方法一
原理:
- 利用
setTimeout函数的第三个参数,会作为回调函数的第一个参数传入 - 利用
bind函数部分执行的特性
代码 1:
for (var i = 0; i < 10; i++) {
setTimeout(i => {
console.log(i);
}, 1000, i)
}代码 2:
for (var i = 0; i < 10; i++) {
setTimeout(console.log, 1000, i)
}代码 3:
for (var i = 0; i < 10; i++) {
setTimeout(console.log.bind(Object.create(null), i), 1000)
}- 利用
方法二
原理:
- 利用
let变量的特性 — 在每一次for循环的过程中,let声明的变量会在当前的块级作用域里面(for循环的 body 体,也即两个花括号之间的内容区域)创建一个文法环境(Lexical Environment),该环境里面包括了当前for循环过程中的i,具体链接
代码 1:
for (let i = 0; i < 10; i++) {
setTimeout(() => {
console.log(i);
}, 1000)
}等价于
for (let i = 0; i < 10; i++) {
let _i = i;// const _i = i;
setTimeout(() => {
console.log(_i);
}, 1000)
}- 利用
方法三
原理:
- 利用函数自执行的方式,把当前 for 循环过程中的 i 传递进去,构建出块级作用域。IIFE 其实并不属于闭包的范畴。参考链接如下:
- 利用其它方式构建出块级作用域,如try...catch
代码 1:
for (var i = 0; i < 10; i++) {
(i => {
setTimeout(() => {
console.log(i);
}, 1000)
})(i)
}代码 2:
for (var i = 0; i < 10; i++) {
try {
throw new Error(i);
} catch ({
message: i
}) {
setTimeout(() => {
console.log(i);
}, 1000)
}
}方法四
原理:
- 很多其它的方案只是把
console.log(i)放到一个函数里面,因为setTimeout函数的第一个参数只接受函数以及字符串,如果是js语句的话,js引擎应该会自动在该语句外面包裹一层函数
代码 1:
for (var i = 0; i < 10; i++) {
setTimeout(console.log(i), 1000)
}代码 2:
for (var i = 0; i < 10; i++) {
setTimeout((() => {
console.log(i);
})(), 1000)
}代码 3:
for (var i = 0; i < 10; i++) {
setTimeout((i => {
console.log(i);
})(i), 1000)
}代码 4:
for (var i = 0; i < 10; i++) {
setTimeout((i => {
console.log(i);
}).call(Object.create(null), i), 1000)
}代码 5:
for (var i = 0; i < 10; i++) {
setTimeout((i => {
console.log(i);
}).apply(Object.create(null), [i]), 1000)
}代码 6:
for (var i = 0; i < 10; i++) {
setTimeout((i => {
console.log(i);
}).apply(Object.create(null), { length: 1, '0': i }), 1000)
}- 很多其它的方案只是把
方法五
原理:
- 利用 eval 或者 new Function 执行字符串,然后执行过程同方法四
代码 1:
for (var i = 0; i < 10; i++) {
setTimeout(eval('console.log(i)'), 1000)
}代码 2:
for (var i = 0; i < 10; i++) {
setTimeout(new Function('i', 'console.log(i)')(i), 1000)
}代码 3:
for (var i = 0; i < 10; i++) {
setTimeout(new Function('console.log(i)')(), 1000)
}
解决for循环里获取到的索引是最后一个的问题的更多相关文章
- 利用闭包解决for循环里onclick事件不能捕捉实时i值问题
问题描述 我们都知道,如果我们对于一组元素(相同的标签)同时进行onclick事件处理的时候(在需要获取到索引的时候),一般是写一个for循环,但是onclick是一个异步调用的,所以会带来一个问题, ...
- uni-app如何解决在for循环里调用异步请求获取数据顺序混乱问题?
总结/朱季谦 先前有一次做uni-app的js接口对接时,遇到过这样的情况,在for循环里,调用一个异步请求时,返回来的值顺序是乱的,因此,在以下的代码里,push到数组里的值,每次的顺序可能都是不一 ...
- JavaScript闭包理解【关键字:普通函数、闭包、解决获取元素标签索引】
以前总觉得闭包很抽象,很难理解,所以百度一下"闭包"概览,百度的解释是:“闭包是指可以包含自由(未绑定到特定对象)变量的代码块:这些变量不是在这个代码块内或者任何全局上下文中定义的 ...
- JavaScript闭包理解【关键字:普通函数、变量访问作用域、闭包、解决获取元素标签索引】
一.闭包(Closure)模糊概述 之前总觉得闭包(Closure)很抽象而且难理解,百度一下"闭包"名词,百度的解释是:“闭包是指可以包含自由(未绑定到特定对象)变量的代 ...
- php 循环里面套sql怎么解决
功能要求: 企业列表(展示企业的基本信息,这里只获取了名称.logo.和服务类型), 服务类型说明: 服务类型一共3级,1.2级是必填的,3级是非必填,如果填的话最多3个, 服务类型1.2.3保存在一 ...
- Day_11【集合】扩展案例2_使用普通for循环获取集合中索引为3的元素并打印,统计集合中包含字符串"def"的数量,删除集合中的所有字符串",将集合中每个元素中的小写字母变成大写字母def",
分析以下需求,并用代码实现 1.定义ArrayList集合,存入多个字符串"abc" "def" "efg" "def" ...
- 百度地图API详解之事件机制,function“闭包”解决for循环和监听器冲突的问题:
原文:百度地图API详解之事件机制,function"闭包"解决for循环和监听器冲突的问题: 百度地图API详解之事件机制 2011年07月26日 星期二 下午 04:06 和D ...
- 【vue】vue使用Element组件时v-for循环里的表单项验证方法
转载至:https://www.jb51.net/article/142750.htm标题描述看起来有些复杂,有vue,Element,又有表单验证,还有v-for循环?是不是有点乱?不过我相信开发中 ...
- Spring 循环依赖的三种方式(三级缓存解决Set循环依赖问题)
本篇文章解决以下问题: [1] . Spring循环依赖指的是什么? [2] . Spring能解决哪种情况的循环依赖?不能解决哪种情况? [3] . Spring能解决的循环依赖原理(三级缓存) 一 ...
随机推荐
- TB6612FNG电机驱动模块
TB6612FNG电机驱动模块 模块原理图 模块的使用 TB6612是双驱动,也就是可以驱动两个电机 下面分别是控制两个电机的IO口 STBY口接单片机的IO口清零电机全部停止, 置1通过AIN1 A ...
- qt-embedded-4.5.3移植到FL2440开发板
1. 2.configure配置 ./configure -opensource -confirm-license -release -shared -fast -no-qt3support -no- ...
- Email地址验证
<script>function validateForm(){ var x=document.forms["myForm"]["email"].v ...
- Quartz SpringBoot 简单整合一下
一次简单的代码整合记录. 数据库准备 如果是MySQL可能出现一些小问题.比如联合主键长度超限制,已经记录解决办法了. CREATE TABLE QRTZ_JOB_DETAILS ( SCHED_NA ...
- 记录一次更改服务器名称导致mysql 不能正常登录、启动
由于客户要求更改服务器的名称,以便区分多台服务器:修改前mysql 能正常登录,但是修改后,登录时报错: Enter password: ERROR 1524 (HY000): Plugin '*C6 ...
- logging模块封装
logging模块封装 #!/usr/bin/env python # -*- coding: utf-8 -*- import datetime import logging import env ...
- 套接字TCP控制台服务器程序代码示范
套接字TCP控制台服务器程序代码示范 https://blog.csdn.net/txwtech/article/details/90344081
- 在群晖NAS上运行URLOS之后竟然能安装Discuz! Q!!
如果我们手头上有1台群晖NAS时,有没有考虑过把群晖NAS当成服务器来使用,这样会不会很有意思呢? 现在,我们终于可以尝试一番了,把群晖NAS变成一台实实在在的服务器,在上面跑各种运行环境!其实很简单 ...
- RocketMQ 内存优化
rocketmq官方文档 RocketMQ 的默认内存占用非常高,调整RocketMQ的内存目前我所知道的有两个方面: MQ的启动脚本可以调整内存mqbroker和mqnamesrv的配置可以调整内存 ...
- 团队进行Alpha冲刺--冲刺总结
这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺--冲刺总结 作业正文 如下 其他参 ...