setTimeout使用闭包功能,实现定时打印数值

我们这次使用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() 是方法的执行调用,在调用这个方法后,当是马上执行!,所以没有达到我们预期的目的

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

for(var i = 0; i< 5; i++ ){

setTimeout(function(){

console.log(i);

},i*1000);

}

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

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

var j = 0;

function abc(){

console.log("j = "+j);

j++;

}

for(var i = 0; i < 10; i++ ){

setTimeout(abc,i*1000)

}

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

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

for(var i = 0; i < 10; i++ ){

(function(x){

setTimeout(function(){

console.log(x)

},x*1000)

})(i)

}

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

本文属于吴统威的博客,微信公众号:bianchengderen,QQ群:186659233 的原创文章,转载时请注明出处及相应链接:http://www.wutongwei.com/front/infor_showone.tweb?id=161 ,欢迎大家传播与分享.

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

时间: 2024-10-22 06:12:19

setTimeout使用闭包功能,实现定时打印数值的相关文章

setTimeOut和闭包

掘金上看到一个setTimeout与循环闭包的思考题.拿过来看了下,一方面了解settimeout的运行机制,还有就是js闭包的特性.关于闭包,有如下解释: 在这里写一点我对闭包的理解.理解闭包的关键在于:外部函数调用之后其变量对象本应该被销毁,但闭包的存在使我们仍然可以访问外部函数的变量对象. function outer() { var a = 1; return function() { return a; }; } var b = outer(); console.log(b()); /

定时打印数字

//自调函数定时执行var i = 0;function fn(){ console.log(i); i++;}var timer = setInterval(function(){ if(i > 10) { clearInterval(timer); } else{ fn(); }},1000);//闭包立即执行队列for(var i = 0; i <= 10; i++ ) { (function(i){ setTimeout(function() { console.log(i) },i*

asp.net 实现在线打印功能,jQuery打印插件PrintArea实现自动分页

使用的组件:jQuery打印插件PrintArea,有兴趣的可以研究一下. 使用方法略过,这里将介绍如何实现打印多页是可以分页. 现在提供两种方法思路: 1.根据特定的打印机型号和使用的纸张类型,然后用JS来算出每页多高,按照每张纸的高度来进行适当的增减高度.(这种方式缺点就是只能针对单中类型的纸张,计算十分的繁琐,要些很多加减法 -_-);). 参考A4纸高度的网页:http://www.jb51.net/office/word/67360.html 2.在如上一个思路的方式,试着查找能不能自

JS 打印功能代码(包括打印预览、打印设置等)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

【新功能】定时备份发到邮件功能已经做好

详情代码看这里:https://github.com/iiYii/getyii/commit/b8315d083d5d07969ac163205bf1452216246666 并且已经开发一个扩展了,欢迎大家使用,扩展地址:https://github.com/yiier/yii2-backup 来源:http://www.getyii.com/topic/38

C# 创建Windows服务。服务功能:定时操作数据库

一.创建window服务 1.新建项目-->选择Windows服务.默认生成文件包括Program.cs,Service1.cs 2.在Service1.cs添加如下代码: System.Timers.Timer timer1;  //计时器 public Service1() { InitializeComponent(); } protected override void OnStart(string[] args)  //服务启动执行 { timer1 = new System.Time

Java--Timer类研究

Timer类是一种线程设施,可以用来实现在某一个时间或者某一段时间后安排某一个任务执行一次或定期重复执行.该功能要与TimerTask 配合使用.TimerTask类用来实现由Timer安排的一次或重复执行的某一个任务. 下面通过一个例子演示Timer和TimerTask类的使用.程序的主要功能是定时打印系统的当前时间. 1.建立TimerTask的子类: import java.util.Date; import java.util.Timer; import java.util.TimerT

测试打印功能

// 先创建窗体,后拉入Button控件两个,一个预览功能,一个打印功能,再拉入控件PrintDocument控件.PrintPreviewDilogs控件.pageSetupDilogs控件 // 后台代码 1 List<string> students = new List<string>() {"张三","李四","王五" }; 2 int count = 0;//要打印的学员姓名的下标值 3 private voi

“小票打印”功能来了!酷客多带你玩转小程序

酷客多(http://www.kukeduo.cn)最近给小程序推出了一个新功能,小票打印功能,可以说这是众多运营者期待已久的功能,这次终于等到了.对于餐饮业运营者来说,这次新功能的推出更加给予了他们极大的便利.现在马上带你感受感受这次酷客多推出的重磅功能! 一.打印准备 1. 打开包装 2. 装入打印纸 移除 二.打印本机信息(用于商家后台配置) 1. 接通打印机电源 2. 长按左键开启打印机 移除 3. 初次开机会自动打印提示 4. 按右键进入菜单 移除 5. 按右键,打印本机信息 移除 三