博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
setTimeout使用闭包功能,实现定时打印数值
阅读量:7019 次
发布时间:2019-06-28

本文共 1111 字,大约阅读时间需要 3 分钟。

我们这次使用setTimeout来实现一个按照时间定时,依次打印数值的例子.其实在早期的时候,也是我经常犯的一个错误,或者实现这种能力,似乎js比较牵强,其实是我的错,哈哈!没能理解JS强大之处.我们直接进入主题吧!

注意,如果用setInterval来实现的话,那肯定很简单,这次我们是使用setTimeout.

我们先从最简单思考入手.那就会写出下面的代码.

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

这段代码虽然依次打印了,每个i的值0,1,2,3,4.但是,执行的时间却没有起作用.为什么呢? 因为 console.log() 是方法的执行调用,在调用这个方法后,当是马上执行!,所以没有达到我们预期的目的

那我们继续看下面一段代码

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

这里我们使用一个匿名函数包含了打印的console.log来打印i,所以 i这个值是共享的,还没等到执行第一个setTimeout的时候,for循环已经执行完成,最后的i = 5,所以i 会打印四次

其实我们两种解决办法,我们先来看第一种:

1 var j = 0;2 function abc(){3 console.log("j = "+j);4 j++;5 }6  7 for(var i = 0; i < 10; i++ ){8 setTimeout(abc,i*1000)9 }

这里我们另外一个全局变量来存储值,每执行一次函数abc,j就加一次,所以执行到setTimeout的时候,就会调用abc函数,所以会达到我们预期的效果,但是这里这个j是一个全局变量,全局变量会造成容易改变其值或者命名冲突等问题.

第二种办法的实现,我们再次引入闭包函数.因为闭包函数,每一次创建都会存在一个自己的空间来存储唯一的值.所以利用这个思维.我们把代码写成下面的代码.

1 for(var i = 0; i < 10; i++ ){2 (function(x){3 setTimeout(function(){4 console.log(x)5 },x*1000)6 })(i)7 }

我们将i的每一次执行for循环的值,传给不同创建的闭包函数,这样每一个闭包函数里存储的i值,就都不会一样.所以就是达到我们的想要的结果.

转载于:https://www.cnblogs.com/joyco773/p/6181045.html

你可能感兴趣的文章
简易抽取
查看>>
js转html实体
查看>>
django框架数据库相关操作
查看>>
FreeSWITCH增加iLBC编码
查看>>
PostgreSQL在线安装
查看>>
iOS中有两种支持机制:Notification和KVO(Key-Value Observing)
查看>>
准备从头复习算法
查看>>
SQL SERVER发布与订阅
查看>>
oracle行转列遇到的一个问题
查看>>
Fiddler
查看>>
Spring Cloud 之 服务注册与发现
查看>>
集合 小结
查看>>
confluence
查看>>
猜拳游戏案例
查看>>
jquery mouseout和mouseleave区别
查看>>
iOS逆向之fishHook怎么通过符号找字符串
查看>>
WCF-简单 配置文件
查看>>
[GeoServer]重拾GeoServer之安装篇
查看>>
在选择屏幕添加长文本,换行等等 全在这里
查看>>
Dubbo背景和简介
查看>>