js for循环_JS 函数的执行时机(深入理解6个6)

定时器:setTimeout()

setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式

提示: 1000 毫秒= 1 秒。 提示: 如果你只想重复执行可以使用 setInterval() 方法。 提示: 使用 clearTimeout() 方法来阻止函数的执行。

语法:setTimeout(x,y,z)

  • x 函数function()
  • y 时间(time)
  • z 参数(会自动传入第一个参数,也就是函数的参数中) 可省略
setTimeout(function(){alert("Hello"); 
}, 3000);

因为setTimeout含义是定时器,需要通过设置(触发)时间来调用代码

假使设置的时间为3000,则在3000毫秒数弹出对话框“Hello” 假使设置的触发时间为“0”时,含义则为尽快调用

打个比喻:老板让你清点运来的箱子,当数到第50个,老板和你说把结果写到纸上交给我。
当下肯定不能进行记录,因为箱子还未清点完成;只有最后数完箱子后,才能在写到纸上交给老板

先把主代码执行完,之后才尽快执行setTimeout中的代码


JS执行(调用)时机

面试题:6个6

思考:以下代码会打印出什么?

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

运行上面代码,看看会打印出什么结果

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

a1b63e80cbb69accb2d3e7c3a77aa335.png
  • JS函数的调用时机不同,得到的结果不同。
  • setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式;其意思就是尽快,而不是马上。

解释:因为setTimeout是一个异步任务,执行到这里的操作会被浏览器丢到另一个任务队列里去, 浏览器这时候会继续执行for循环。每一次for循环的时候,setTimeout都执行一次,但是里面的函数没有被执行,而是被放到了任务队列里面,等待执行,for循环了6次,就放了6次,当主线程执行完成后,才进入任务队列里面执行。这时候因为for循环i=6了,所以输出的全部都是6。

如何理解异步呢?

异步代码不等待结果,直接进行下面的代码,所以定时器只是开启了,而没有立即执行里面的代码,等到当前运行坏境的代码执行完之后再回来执行定时器里面的代码。总结:异步就是不等待结果的代码。

解释二:如案例中所示,setTimeout的调用时间为“0”(尽快调用),只有当主代码执行完一遍后才会执行setTimeout(定时器),但这时i已经为6,所以打印出数值6.

又因为条件:i<6,共执行了6次(当i等于6时跳出循环),所有结果为一共打印出6次6。

思考:那么怎么正确显示?(如何打印出0、1、2、3、4、5)


方法一:let关键字

原理:每次进入进入循环时,JS会把当前的复制一份路i在循环空间里(i=0,i=1...) 不会跟随新的i跟变化

JS变态之处:把let声明写入for循环中,则会正常打印出 0、1、2、3、4、5 (服了JS,迎合新人)
for(let i = 0; i<6; i++){setTimeout(()=>{console.log(i)},0)
}

219645004b9775a9f31026d3633e2482.png

解释:因为let变量的作用域只能在当前函数中,所以每次for循环生成的都是一个新的i,setTimeout里输出的i就是这个新的i,这个i是不会变化的,所以输出的就是正常的。

迦南:var、let、consts在JavaScript变量/常量的定义​zhuanlan.zhihu.com
95c1c3144291dbd1966d4e980af4eaec.png

除了使用 for let 配合,还有什么其他方法可以打印出 0、1、2、3、4、5?

方法二:

for(i=0;i<6;i++){let j = isetTimeout(()=>{console.log(j)},1000)
}

方法三:闭包

for(var i=0;i<6;i++){!function(i){  //这是里面的i //在匿名函数前加上运算符‘ !’,不生成新的全局变量(防止污染全局)setTimeout(()=>{console.log(i)},1000)  //这是里面的i}(i)  //这是外面的i //在匿名函数后加个()立即执行,并把i当作参数value传入匿名函数循环执行,参数i和匿名函数组成了闭包
}

99bdf98e09bb44b51bf98805e242974f.png

原理:

  • 声明匿名函数 function(value){} 包裹 setTimeout()
  • 然后再匿名函数前加上运算符‘ !’,防止生成新的全局变量(避免污染全局)
  • 在匿名函数后加个()立即调用,并把 i 当作参数 value 传入匿名函数进行调用

注意:参数i和匿名函数会组成了闭包

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

方法四:利用 setTimeout 的第三个参数,将i传进去

let i
for(i = 0; i<6; i++){setTimeout((value)=>{console.log(value)},0,i)   //setTimeout 第三个参数,声明后这个参数可以将自身传给第一个参数 function(value),
}

原理:

使用setTimeout 的第三个参数--这个参数可以将自身传给第一个参数
也就是匿名函数function(value)中,作为所需要的参数value,value可默认不写
而 i 共传入6次(0,1,2,3,4,5),通过匿名函数即可打印出
通常不写第三个三处,如果默认不写第三个参数,则不会传入函数

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

简单一句换:setTimeout的第三个参数作用,它就是当作setTimeout第一个函数的参数

方法五:const关键字

let i
for(i = 0; i<6; i++){const x = isetTimeout(()=>{console.log(x)})
}

拓展例1:

function sum(x,y,z){console.log(x+y+z);
}
setTimeout(sum,1000,1,2,3);

fadf2f6b2d969d909652c01049214bfa.png

拓展例2:

var i=0;
setTimeout(function(){console.log('第二次'+i)
},3000,setTimeout(function(){console.log('第一次'+i);i++;
},1000));

66041f3c75a77103cfbb823f8ac5e517.png
最后依次输出为 第一次0 第二次1
可以看到第三个参数还可以是先执行,然后再执行函数

不过还要注意一点就是:

这种传参方式在IE9及更低的版本下是不起作用的

setTimeout的意思

setTimeout(fn(),1000)
f2()

1000ms后尽快执行fn(),不代表马上执行,如f2()中写了10000行代码,需要花10秒执行完,那么,fn()会在10秒之后执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431582.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OCLint+Xcode 代码规范利器

很多公司里面都会强调代码规范的问题&#xff0c;开发者也都知道代码规范的好处。可实际开发中往往因为各种原因使我们把它的优先级不知不觉中降低了。  这里向一个有代码追求和洁癖的程序猿推荐一个分析工具&#xff0c;它可以成为你重构代码或着review的基本规则 OCLint是一…

MySQL求类型为GX的平均积分_mysql基本操作

一、连接操作格式&#xff1a;mysql-h主机地址 -u用户名 -p用户密码例&#xff1a;连接到远程主机上的mysql假设远程主机的IP为&#xff1a;110.110.110.110用户名为root,密码为abcd123则键入以下命令&#xff1a;mysql-h110.110.110.110-uroot-pabcd123二、用户级操作1、selec…

k均值聚类算法优缺点_Grasshopper实现K均值聚类算法

本文很长很长&#xff0c;有很多很多图&#xff0c;包含以下部分&#xff1a;1.算法简介2.如何分类平面点3.如何分类空间点4.如何分类多维数据5.后记提醒&#xff1a;以下内容包括&#xff1a;智障操作&#xff0c;无中生友&#xff0c;重复造轮子 等1.算法简介k均值聚类算法&a…

fullgc频繁的原因_系统运行缓慢,CPU 100%,Full GC次数过多,这一招帮你全搞定

处理过线上问题的同学基本上都会遇到系统突然运行缓慢&#xff0c;CPU 100%&#xff0c;以及Full GC次数过多的问题。当然&#xff0c;这些问题的最终导致的直观现象就是系统运行缓慢&#xff0c;并且有大量的报警。本文主要针对系统运行缓慢这一问题&#xff0c;提供该问题的排…

WEKA “Detailed Accuracy By Class”和“Confusion Matrix”含义

原文 Summary &#xff08;总结&#xff09;Correctly Classified Instances&#xff08;正确分类的实例&#xff09; 45 90 %Incorrectly Classified Instances &#xff08;错误分类的实例&#xff09; 5 10 %Kappa …

es删除数据_面试官是怎么来考察你对ES搜索引擎的理解?

来源:http://1t.click/ZdY一. 面试官心理分析问这个&#xff0c;其实面试官就是要看看你了解不了解 es 的一些基本原理&#xff0c;因为用 es 无非就是写入数据&#xff0c;搜索数据。你要是不明白你发起一个写入和搜索请求的时候&#xff0c;es 在干什么&#xff0c;那你真的是…

一个分布式服务器集群架构方案

0x01.大型网站演化 简单说&#xff0c;分布式是以缩短单个任务的执行时间来提升效率的&#xff0c;而集群则是通过提高单位时间内执行的任务数来提升效率。 集群主要分为&#xff1a;高可用集群(High Availability Cluster)&#xff0c;负载均衡集群(Load Balance Cluster&…

python数据预处理_Python数据预处理——缺失值、重复值

一、缺失值处理 isnull( ) 、fillna( ) 、dropna( )&#xff08;1&#xff09;查看缺失查看数据集缺失&#xff0c;返回每列的缺失个数 df.isnull().sum() 查看某字段有缺失的行 df[df.a.isnull()] 查看某字段每行的缺失情况&#xff1a;返回T/F&#xff1a;df.score.isnull() …

vb如何测试连接mysql_VB怎么连接访问Access数据库?

VB是我们常常会见到的一款可视化程序设计语言&#xff0c;它的功能十分强大&#xff0c;因此有很多人会使用它&#xff0c;但是有时候我们需要用到VB来连接Access数据库&#xff0c;但是却无从下手&#xff0c;那么VB怎么连接访问Access数据库呢&#xff1f;不懂的朋友请看以下…

textarea如何在文字后面_FLASH如何制作风吹文字的效果

使用动作补间动画可以制作各种各样的动态效果&#xff0c;树叶飘落、蝴蝶飞舞等。这里再使用引导层动画结合动作补间动画制作风吹文字飞起的效果。主要知识点&#xff1a;引导层动画、动作补间动画FLASH如何制作树叶飘落​jingyan.baidu.comFlash如何制作飞舞的蝴蝶​jingyan.b…

ef mysql 外键 一对一_EFCore-一对一配置外键小记2

前后两次遇到这样的错误&#xff1a;The property xx on entity type xxxx has a temporary value. Either set a permanent value explicitly or ensure that the database is configured to generate values for this property.多数情况下是表配置关系会出现这样的问题。我实…

矩阵快速幂 HDU3483

1 #include <iostream>2 #include <cstring>3 4 using namespace std;5 6 //矩阵大小上限7 const int SIZ100;8 int MOD;9 10 //矩阵大小为n*m&#xff0c;初始化全部为011 struct mat12 {13 int n,m;14 long long ar[SIZ][SIZ];15 mat()16 {17 …

哲学家就餐问题python_Python实现哲学家就餐问题实例代码

哲学家就餐问题&#xff1a; 哲学家就餐问题是典型的同步问题&#xff0c;该问题描述的是五个哲学家共用一张圆桌&#xff0c;分别坐在五张椅子上&#xff0c;在圆桌上有五个盘子和五个叉子&#xff08;如下图&#xff09;&#xff0c;他们的生活方式是交替的进行思考和进餐&am…

fpga摄像头模块_FPGA开源项目:双目测距(一)之双目图像采集显示以及图片保存...

1.简述这个项目是大三下学期暑假(也就是2019年8份)完成的&#xff0c;当时的视频效果已发布在bilibili上&#xff0c;这是我们的省级的科研立项&#xff0c;其实就我一个人负责完成。发布bilibili后很多人比较感兴趣&#xff0c;打算年初回学校完成毕设期间开源的&#xff0c;一…

github ssh 配置_Github远程仓库克隆更新本机,SSH协议免密操作配置和注意事项

Github远程仓库-克隆远程仓库到本机 【重点】目标如何克隆远程仓库到本机呢&#xff1f;小结下载项目的命令&#xff1a;git clone https://gitee.com/kekesam/sassweb777.git注意&#xff1a;1&#xff1a;它会自动创建本地仓库&#xff1b;2&#xff1a;它也会自动和远程仓库…

golang中文文档_【译】Go 语言源码贡献官方指导文档

以前给 Go 语言项目源码提交过一些 commits&#xff0c;期间阅读他们的官方指导文档的时候觉得这篇指导文档可以作为绝佳的关于大型软件项目的规范管理的参考&#xff0c;因为最近又提交了几个 commits&#xff0c;就又把这篇文档再看了一遍&#xff0c;有感于 Go 团队在项目管…

mysql增加最大连接数_mysql最大连接数怎么设置

设置mysql最大连接数的方法&#xff1a;首先打开mysql的控制台&#xff1b;然后输入语句【set GLOBAL max_connections1000;】即可直接设置最大连接数。通常&#xff0c;mysql的最大连接数默认是100, 最大可以达到16384&#xff1b;如果我们想修改mysql的最大连接数&#xff0c…

让一个动画一直执行的属性是_iOS 动画 一

View AnimationsAnimatable properties• bounds: 改变 bounds 属性可以在当前 view 内改变子视图等的相对位置。• frame: 改变 frame 可以移动或者缩放 view 。• center: 当你想移动 view 到屏幕的新位置时&#xff0c;可以改变此属性。• backgroundColor: 背景颜色。• al…

阿里云java mysql环境_阿里云搭建centos java mysql nginx环境

1.上传下载yum install lrzszsz下载rz上传2.安装压缩命令yum install -y unzip zip;3.安装javarpm -ivh jdk-8u161-linux-x64.rpm4.安装mysqlyum install libaioyum -y remove mariadb-libs-5.5*rpm -ivh mysql-community-common-5.7.21-1.el7.x86_64.rpmrpm -ivh mysql-commun…

ide快捷键_一款好用的IDE怎么可以没有代码提示?

我在使用过IntelliJ IDEA(一款Java开发工具)之后&#xff0c;感觉Delphi的IDE在编写代码方面尤其是代码提示方面和IntelliJ IDEA相比真的天差地别&#xff0c;所以决定认真的研究一下Delphi的代码提示功能一般情况下我们使用Delphi的开发工具都会安装cnpack专家包&#xff0c;但…