返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JS关于for循环中使用setTimeout的四种解决方案
  • 445
分享到

JS关于for循环中使用setTimeout的四种解决方案

2024-04-02 19:04:59 445人浏览 八月长安
摘要

目录概述解决方案1:闭包解决方案2:拆分结构解决方案3:let解决方案4:setTimeout第三个参数概述 我们先来简单了解一下setTimeout延时器的运行机制。setTime

概述

我们先来简单了解一下setTimeout延时器的运行机制。setTimeout会先将回调函数放到等待队列中,等待区域内其他主程序执行完毕后,按时间顺序先进先出执行回调函数。本质上是作用域的问题。

因此若是这样将不会得到想要的结果输出1.2.3.4.5,而会连续输出5个6。


for (var i=1; i<=5; i++) {
    setTimeout( function timer() {
        console.log( i );
     }, i*1000 );
}

这是因为setTimeout是异步执行,每一次for循环的时候,setTimeout都执行一次,但是里面的函数没有被执行,而是被放到了任务队列里,等待执行。只有主线上的任务执行完,才会执行任务队列里的任务。也就是说它会等到for循环全部运行完毕后,才会执行fun函数,但是当for循环结束后此时i的值已经变成了6,因此虽然定时器跑了5秒,控制台上的内容依然是6。

(注意:for循环从开始到结束的过程,需要维持几微秒或几毫秒,当定时器跑完一秒之后for循环早已经做完了。)

我们来看另一种情况:


for (var i=1; i<=5; i++) {
    (function() {
        setTimeout( function timer() {
            console.log( i );
        }, i*1000 );
    })();
}

由setTimeout的运行机制可以知道,首先会运行外部的所有主程序,虽然for循环内形成了闭包,但是fun并没有发现一个实参所以跟第一个例子并无实际差别,仍然是连续输出5个6。

解决方案1:闭包

使用闭包是很经典的一种做法:


for (var i=1; i<=5; i++) {
    (function(j) {
        setTimeout( function timer() {
            console.log( j );
        }, j*1000 );
    })(i);
}

我们可以发现跟预期结果一致,依次输出1到5,因是因为实际参数跟定时器内部的i有强依赖。

通过闭包,将i的变量驻留在内存中,当输出j时,引用的是外部函数的变量值i,i的值是根据循环来的,执行setTimeout时已经确定了里面的的输出了。

解决方案2:拆分结构

我们还可以将setTimeout的定义和调用分别放到不同部分:


function timer(i) {
    setTimeout( console.log( i ), i*1000 );
}
for (var i=1; i<=5;i++) {
    timer(i);
}

控制台上输出依然是依次输出1到5。

解决方案3:let

这里再来说一说使用es6的let来解决此问题:


for (let i=1; i<=5; i++) {
    setTimeout( function timer() {
        console.log( i );
     }, i*1000 );
}

这个例子与第一个相比,只是把var更改成了let,可是控制台的结果却是依次输出1到5。

因为for循环头部的let不仅将i绑定到for循环中,事实上它将其重新绑定到循环体的每一次迭代中,确保上一次迭代结束的值重新被赋值。setTimeout里面的function()属于一个新的域,通过var定义的变量是无法传入到这个函数执行域中的,通过使用let来声明块变量能作用于这个块,所以function就能使用i这个变量了;这个匿名函数的参数作用域和for参数的作用域不一样,是利用了这一点来完成的。这个匿名函数的作用域有点类似类的属性,是可以被内层方法使用的。

解决方案4:setTimeout第三个参数


for (let i=1; i<=5; i++) {
    setTimeout( function timer() {
        console.log( i );
     }, i*1000, i );
}

由于每次传入的参数是从for循环里面取到的值,所以会依次输出1到5。

以上就是js关于for循环中使用setTimeout的四种解决方案的详细内容,更多关于JS使用setTimeout的资料请关注编程网其它相关文章!

--结束END--

本文标题: JS关于for循环中使用setTimeout的四种解决方案

本文链接: https://lsjlt.com/news/125197.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JS关于for循环中使用setTimeout的四种解决方案
    目录概述解决方案1:闭包解决方案2:拆分结构解决方案3:let解决方案4:setTimeout第三个参数概述 我们先来简单了解一下setTimeout延时器的运行机制。setTime...
    99+
    2024-04-02
  • JS中六种For循环怎么使用
    这篇文章主要介绍“JS中六种For循环怎么使用”,在日常操作中,相信很多人在JS中六种For循环怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JS中六种For循环怎么使用”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-30
  • JS中for循环的四种写法示例(入门级)
    目录1. 传统for循环2. for of 循环3. for in 循环4. forEach方法附完整实例:总结1. 传统for循环 for (init; cond; inc) { ...
    99+
    2024-04-02
  • JAVA中的for循环几种使用方法讲解
    目录一般写法1.遍历数组的传统方式2.遍历Collection对象的传统方式第二种写法3.遍历数组的简单方式4.遍历Collection的简单方式防止在循环体里修改循环变量5.禁止重...
    99+
    2024-04-02
  • 关于spring循环依赖问题及解决方案
    目录一、三种循环依赖的情况比如几个Bean之间的互相引用 甚至自己“循环”依赖自己二、解决方案如何获取依赖三、解决循环依赖必须要三级缓存吗结论四、无...
    99+
    2024-04-02
  • 一文带你搞懂JS中六种For循环的使用
    目录一、各个 for 介绍1、for2、for ... in3、for ... of4、for await...of5、forEach6、map二、多个 for 之间区别1、使用场景...
    99+
    2024-04-02
  • 关于var在for循环遇到的问题解决
    前言 var是ES5定义变量的一种声明方式,一直听说var声明变量,存在循环变量泄漏为全局变量问题,但总是想不明白这个“全局”有什么影响,还有,到底什么时候输出的结果是递增/减的值,...
    99+
    2024-04-02
  • 详解Rust中三种循环(loop,while,for)的使用
    目录楔子loop 循环while 循环for 循环楔子 我们常常需要重复执行同一段代码,针对这种场景,Rust 提供了多种循环(loop)工具。一个循环会执行循环体中的代码直到结尾,...
    99+
    2024-04-02
  • 关于Java中增强for循环使用的注意事项
    序言 for循环语句是java循环语句中最常用的循环语句,一般用在循环次数已知的情况下使用。for循环语句的语法格式如下: java语言 for语句的用法   for(...
    99+
    2024-04-02
  • python中for循环的多种使用实例
    目录前言for循环迭代字符串for打印数字注意for循环不能迭代数值类型for循环打印数字的话要借用range函数for循环可用来初始化列表简单的往列表里添加数据列表推导式总结前言 ...
    99+
    2024-04-02
  • golang包循环引用的几种解决方案总结
    目录1. golang 包循环引用的几种解决方案1.1. 前言1.2. 新建公共接口包(父包), 将需要循环调用的函数或方法抽象为接口1.3. 新建公共组合包(子包), 在组合包中组...
    99+
    2024-04-02
  • Oracle中for循环的使用方法
    Oracle for in loop 循环的一些实例,以作学习和加强使用熟练度及场景应用. 一些技巧 for 语句后面的 loop end l...
    99+
    2024-04-02
  • JavaScript中三种for循环语句的使用总结(for、for...in、for...of)
    前言 每个接触JS的开发人员都不可避免的与for循环打交道,毕竟这是遍历必不可少的工具之一。JavaScript 中的 for 循环语句相信大家都已经快用厌了,现在有好多文章都在讲怎...
    99+
    2024-04-02
  • js中for in循环的使用注意哪些问题
    这篇文章主要介绍“js中for in循环的使用注意哪些问题”,在日常操作中,相信很多人在js中for in循环的使用注意哪些问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”js中for in循环的使用注意哪...
    99+
    2023-06-25
  • v-for循环中使用require/import关键字引入本地图片的几种方式
    目录问题描述 方式一(后端返回图片URL) 方式二(前端使用require) 方式三(前端使用import) 总结 问题描述 我们做项目中,常常需要把图片呈现到页面上,一般来说有以...
    99+
    2024-04-02
  • Python使用for实现无限循环的多种方式汇总
    目录Python使用for实现无限循环python遍历循环与无限循环遍历循环无限循环循环控制保留字循环的高级用法总结Python使用for实现无限循环 # 方法1.1:借助循环遍历列...
    99+
    2023-03-02
    Python使用for Python无限循环 Python for无限循环
  • 在vue中v-for循环遍历图片不显示错误的解决方案
    目录v-for循环遍历图片不显示错误错误vue本地图片路径正确,但for循环不显示经过改正加个require()就可以显示了v-for循环遍历图片不显示错误 <template...
    99+
    2024-04-02
  • 如何解决js中for循环输出i为同一值的问题
    这篇文章主要介绍如何解决js中for循环输出i为同一值的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、最近开发中遇到一个问题,为什么每次输出都是5,而不是点击每个p,就ale...
    99+
    2024-04-02
  • python 列表元素左右循环移动 的多种解决方案
    如下所示: #待处理列表 A= [1,2,3,4,5] #移动次数 a = 3 右移比较简单 for i in range(a): A.insert(0,A.pop())...
    99+
    2024-04-02
  • @OneToMany查询陷入循环引用的解决方案
    目录@OneToMany查询陷入循环引用问题问题报错如下解决方案:按需改为LAZY即可JPA@OneTOMany查询在ruturn的时候出现错误java.lang.IllegalSt...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作