js中for循环与定时器

2023-11-04

for (var i = 0; i < 6; i++) {
            setTimeout(() => {
                console.log(i);
            }, 1000);
        }

如上代码,我们编写代码的思路是想要使 0 1 2 3 4 5间隔1秒陆续出现
但是真正的结果是连续输出6个6

这里面涉及到了同步与异步的问题

setTimeout是异步执行的,每一次执行一次for循环时,setTimeout都会执行一次,但是里面的函数却不会执行,而是被放在了任务对列里面,也就是说只有主线上的全部执行完才会执行任务队列里的任务 == for循环全部执行完毕后(此时 i=5),才开始执行fun函数,因此虽然定时器跑了6秒,但控制台上是6个6

也可以理解为:

(for循环非常的快,从开始到结束只需要几微妙或几毫秒,当定时器跑完一秒之后for循环早就全部执行完成)

解决方法1:闭包

 for (var i = 0; i < 6; i++) {
            (function(j) {
                setTimeout(() => {
                    console.log(j);
                }, j * 1000);
            }(i));
            // 代码格式
           // (function(a) {})(b)
        }

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

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

解决方法2:拆分结构

  function timeout(i) {
            setTimeout(console.log(i), i * 1000);
        }
        for (var i = 0; i < 6; i++) {
            timeout(i);
        }

这个是在网上看到的,确实可以输出1到5,但似乎没有做到一秒一个,仅供参考

解决方法3:let

 for (let i = 0; i < 6; i++) {
            setTimeout(function() {
                console.log(i);
            }, i * 1000)
        }

这个强烈推荐,简单好记还有用!!!!!

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

let和var区别

下面是转载一位博主的博客
let和var区别

解决方法4:第三个参数

 for (let i = 0; i < 6; i++) {
            setTimeout(function() {
                console.log(i);
            }, i * 1000, i)
        }

由于每次都是从for里面取到的值,所以会依次输出1到5

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

随机推荐

  • 计算机网络3——传输层(上)

    目录 一 概述 二 多路复用和多路分用 1 无连接分用 2 面向连接的分用 三 无连接传输协议UDP 四 可靠数据传输原理 1 Rdt 1 0 2 Rdt 2 0 3 Rdt 2 1和2 2 4 Rdt 3 0 五 流水线机制与滑动窗口协议
  • linux 结构体 aligned,__attribute__((__aligned__(n)))对结构体对齐的影响

    1 attribute 是什么 attribute 是GCC里的编译参数 用法有很多种 感兴趣可以阅读一下gcc的相关文档 这里说一下 attribute 对变量和结构体对齐的影响 这里的影响大概分为两个方面 对齐和本身占用的字节数的大小
  • ubuntu安装配置Nginx

    Nginx下载 Nginx官网下载页面 下载其中的Stable version 我这里是nginx 1 20 1 安装依赖库 sudo apt install libpcre3 libpcre3 dev zlib1g dev openssl
  • Java HashMap什么时候进行扩容呢?

    下文笔者讲述HashMap什么时间进行扩容的简介说明 如下所示 HashMap进行扩容的时间点 1 put元素时 会触发resize方法在内部进行扩容 将把原来的数据rehash放进扩容后的桶中 2 数组的容量必须达到树化的容量的最小值默认
  • python如何输出矩阵的行数与列数?

    Python如何输出矩阵的行数与列数 对于pyhton里面所导入或者定义的矩阵或者表格数据 想要获得矩阵的行数和列数有以下方法 1 利用shape函数输出矩阵的行和列 x shape函数可以输出一个元组 m n 其中元组的第一个数m表示矩阵
  • 解决口袋动画产生的片头动画无法使用powerpoint导出成视频的问题

    问题 口袋动画中的片头做得非常漂亮 放在ppt中可以显示 但是一旦使用ppt中的导出功能就会闪退 如何解决 解决 1 点击 口袋动画PA SHEET 2 动画盒子 gt 选择 3 下载 4 导出
  • linux查看inode使用情况,Linux Inode信息及inode使用率是指什么? - 新手站长网

    Linux服务器云监控会显示Inode信息及inode使用率选项 很多用户什么原因 新手站长网分享Linux系统下的inode原理 inode使用率及inode查询命令 什么是inode信息 Linux inode信息 什么是inode信息
  • 无线充电接收原理图—TWS充电盒方案

    无线充电接收原理图 TWS充电盒方案 原理图百度云下载 链接 https pan baidu com s 1VuIYg5vgPX6wKrWYCZ0bmg 提取码 iq3w
  • java-引用与对象

    我们先定义一个简单的类 class Vehicle int passengers int fuelcap int mpg 有了这个模板 就可以用它来创建对象 Vehicle veh1 new Vehicle 通常把这条语句的动作称之为创建一
  • 目前主流的几款文件上传控件,以及优缺点

    1 WebUploader 官网 http fex baidu com webuploader getting started html API http fex baidu com webuploader doc index html W
  • Linux 帮助手册安装不全

    今天在新安装的 fedora 17 虚拟机上写多线程程序的时候 本想查看下系统帮助手册中关于线程相关函数的说明 结果 tom localhost thread man pthread create No manual entry for p
  • 手把手教你配置BSC(币安智能链)网络,只需5分钟

    这里就用小狐狸 Metamask 钱包了 因为本人坚信用狐狸钱包日后可以撸到空投 1 PC端Chrome浏览器安装metamask钱包插件 要去Metamask官网下载钱包哦 然后把插件添加至Chrome浏览器扩展程序中 这个不会的小伙伴欢
  • 【Vue系列5】——Vue组件化开发入门篇

    点赞多大胆 就有多大产 开源促使进步 献给每一位技术使用者和爱好者 干货满满 摆好姿势 点赞发车 前言 本文主要说一下组件化开发一些概念和基本使用 有基础的小伙伴应该听过组件通信 插槽等这样的概念 我们下篇再说 在具体编码之前我们需要知道两
  • JS判断数组是否存在交集

    2019独角兽企业重金招聘Python工程师标准 gt gt gt
  • 服务器卡死,重启报错: INFO: task blocked for more than 120 seconds

    问题 服务器负载很高 但是CPU利用率不高 服务器经常夯住 网站打不开 SSH连接非常不稳定 输入命令夯住 重启服务器报错 INFO task blocked for more than 120 seconds 问题原因 默认情况下 Lin
  • Linux下安装配置tomcat

    Linux下安装配置tomcat 1 安装 Tomcat版本 6 0 29 Linux版本 Radhat Enterprise 5 5 Jdk版本 1 6 0 20 解压缩tomcat tar zxvf apache tomcat 6 0
  • python+django网上美食菜品订餐系统的设计与实现vue

    随着科学技术的飞速发展 社会的方方面面 各行各业都在努力与现代的先进技术接轨 通过科技手段来提高自身的优势 好吃网线上订餐系统当然也不能排除在外 从美食类型 美食信息的统计和分析 在过程中会产生大量的 各种各样的数据 本文以好吃网线上订餐系
  • JS - 基本语法

    JavaScript是一种脚本语言 主要功能是 动态修改html页面内容 包括创建 删除html页面元素 修改html页面元素的内容 外观 位置 大小等 数据类型和变量 任何语言都离不开数据类型和变量 虽然JavaScript语言是弱类型的
  • D-S证据理论

    一 前言 20世纪60年代美国哈佛大学数学家A P Dempster利用上 下限概率来解决多值映射问题方面的研究工作 自1967年起连续发表了一系列论文 标志着证据理论的诞生 Dempster的学生G Shafer对证据理论做了进一步发展
  • js中for循环与定时器

    js中for循环和定时器的问题 有四个解决方法 这里面涉及到了同步与异步的问题 也可以理解为 解决方法1 闭包 解决方法2 拆分结构 解决方法3 let let和var区别 解决方法4 第三个参数 for var i 0 i lt 6 i