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是一…

python指定文件路径_python实现指定文件夹下的指定文件移动到指定位置

# coding:utf-8 import os import shutil import sys reload(sys) sys.setdefaultencoding(utf8) # print os.getcwd() # 有些文件夹下面有很多文件夹&#xff0c;每个文件夹下面有很多视频文件&#xff0c;现在通过脚本&#xff0c;将文件夹下面的所有文件转移到一个目录下面 …

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…

PC-红警联机问题与下载

或许不是软件问题&#xff1a; 你做好相关设置了吗&#xff1f; 红警局域网联机的具体方法: 适用于原版红警、尤里复仇&#xff0c;及任何同样的扩展版。 第一步&#xff1a;安装IPX协议。 方法&#xff1a; 控制面板——网络连接&#xff08;或网上邻居属性&#xff09;——本…

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

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

ip地址异常判定python_python检测异常ip,并查询ip详细信息

#!/usr/local/bin/python3# coding:utf-8import string, subprocess, send_mailfrom time import strftime, gmtime, sleep, reimport urllib.request, redef filter_tags(htmlstr):re_cdata re.compile(//]*//\]\]>, re.I) # 匹配CDATAre_script re.compile(]*>[^, re…

保持充沛的精力

转载的&#xff1a;原文地址&#xff1a;http://www.cnblogs.com/siylz/p/4589134.html不管我们做大事还是小事&#xff0c;最需要的是精力。一个人有了充沛的精力&#xff0c;干什么大事都不成问题。可是有不少人往往把他们那宝贵的精力胡乱挥橄在那些走无意义、自讨苦吃的事情…

php while mysql_我怎么能避免在PHP的While循环中使用MySQL查询

我有一个输出类列表的while循环.在类数据库中,教师名称由用户数据库中的教师ID确定.这是我的数据库结构.Classes Database-----------------------------ID CLASS TEACHER1 product design 3User Database-----------------------------ID NAME3 John Doe因此,当列出我的类时,我…

Jq_网站顶部定时折叠广告

<!DOCTYPE html><html xmlns"http://www.w3.org/1999/xhtml"><head><title>网页顶部定时收起广告jQuery特效 - HoverTree</title><base target"_blank" /><style>a {color:blue;text-decoration:none;}</sty…

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

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

python 局域网扫描_Python 简化版扫描局域网存活主机

[code]Python 简化版局域网扫描获取存活主机IP by 郑瑞国1、ping指定IP判断主机是否存活2、ping所有IP获取所有存活主机#注: 若在Linux系统下 ping -n 改为 ping -c若在windows系统下 ping -n 不变import socketimport osimport threadingimport timeIPList []def ping_ip(ip)…

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;那你真的是…

thinkphp mysql函数_thinkphp对数据库操作有哪些内置函数

getModelName() 获取当前Model的名称getTableName() 获取当前Model的数据表名称switchModel(type,varsarray()) 动态切换模型table() 设置当前操作的数据表field() 设置要查询的数据字段where() 设置查询或者操作条件data(data) 设置数据对象order(order) 设置排序limit(limit)…

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

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;不懂的朋友请看以下…

pthread 简要使用指南

http://www.2cto.com/kf/201208/151995.html http://www.2cto.com/kf/201208/151997.html转载于:https://www.cnblogs.com/alanhu/p/4677399.html

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.多数情况下是表配置关系会出现这样的问题。我实…