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


Posted in Javascript onDecember 18, 2015

我们这次使用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值,就都不会一样.所以就是达到我们的想要的结果.

ps:使用闭包对setTimeout进行简单封装

在写js脚本时,经常会用到一些拼写函数的情况,例如调用setTimeout

var msgalert="test"; 
 function TestAlert(msg) 
   { 
    alert(msg) 
   } 
    
   $(document).ready(function () { 
  $("#btnCancel").click(function (e) { 
    setTimeout("TestAlert("+msgalert+")",1000); 
    }); 
})

查了很长时间,为什么就是弹不出对话框呢。检查了很长时间才发现,原来是少了一对单引号

$(document).ready(function () { 
  $("#btnCancel").click(function (e) { 
    setTimeout("TestAlert('"+msgalert+"')",1000); 
    }); 
})

这样的写法容易出错,还不容易检查出错误,如果使用闭包就可完全避免,改写如下

var msgalert="test"; 
  function dalayAlert(msg ,time){  
  setTimeout( 
  TestAlert(msg), 
  time 
  ); 
  }  
 function TestAlert(msg) 
 { 
  alert(msg) 
 } 
$(document).ready(function () {   
$("#btnCancel").click(function (e) { 
   dalayAlert(msgalert,1000) 
 });

由于使用了闭包,也简单了很多,检查错误也很容易了

Javascript 相关文章推荐
代码精简的可以实现元素圆角的js函数
Jul 21 Javascript
Extjs学习笔记之一 初识Extjs之MessageBox
Jan 07 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
Mar 17 Javascript
Jquery为单选框checkbox绑定单击click事件
Dec 18 Javascript
通过$(this)使用jQuery包装后的方法或属性
May 18 Javascript
Json解析的方法小结
Jun 22 Javascript
Bootstrap select实现下拉框多选效果
Dec 23 Javascript
滚动条的监听与内容随着滚动条动态加载的实现
Feb 08 Javascript
JavaScript设计模式之调停者模式实例详解
Feb 03 Javascript
JavaScript面试出现频繁的一些易错点整理
Mar 29 Javascript
实例讲解JavaScript预编译流程
Jan 24 Javascript
javascript+HTML5 canvas绘制时钟功能示例
May 15 Javascript
jquery获取css的color值返回RGB的方法
Dec 18 #Javascript
jQuery实现textarea自动增长宽高的方法
Dec 18 #Javascript
jquery简单倒计时实现方法
Dec 18 #Javascript
js命名空间写法示例
Dec 18 #Javascript
JavaScript Split()方法
Dec 18 #Javascript
jquery中object对象循环遍历的方法
Dec 18 #Javascript
JavaScript的Number对象的toString()方法
Dec 18 #Javascript
You might like
PHP foreach循环使用详解与实例代码
2010/05/08 PHP
php 解决旧系统 查出所有数据分页的类
2012/08/27 PHP
Laravel框架自定义公共函数的引入操作示例
2019/04/16 PHP
js截取函数(indexOf,join等)
2010/09/01 Javascript
jQuery 常用代码集锦(必看篇)
2016/05/16 Javascript
Javascript随机标签云代码实例
2016/06/21 Javascript
jQuery简单自定义图片轮播插件及用法示例
2016/11/21 Javascript
微信小程序 生命周期和页面的生命周期详细介绍
2017/01/19 Javascript
JS获得一个对象的所有属性和方法实例
2017/02/21 Javascript
详解AngularJS 模块化
2017/06/14 Javascript
bootstrap基本配置_动力节点Java学院整理
2017/07/14 Javascript
详解如何使用babel进行es6文件的编译
2018/05/29 Javascript
vuejs实现标签选项卡动态更改css样式的方法
2018/05/31 Javascript
详解Webpack loader 之 file-loader
2018/11/07 Javascript
vue.js循环radio的实例
2019/11/07 Javascript
vue elementui tree 任意级别拖拽功能代码
2020/08/31 Javascript
[48:46]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第二场 11.19
2020/11/19 DOTA
Python 两个列表的差集、并集和交集实现代码
2016/09/21 Python
Python中函数eval和ast.literal_eval的区别详解
2017/08/10 Python
python数据结构之列表和元组的详解
2017/09/23 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
2018/10/30 Python
Python实现Selenium自动化Page模式
2019/07/14 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
2019/10/09 Python
CSS3 三维变形实现立体方块特效源码
2016/12/15 HTML / CSS
Aquatalia官网:意大利著名鞋履品牌
2019/09/26 全球购物
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
LightInTheBox法国站:中国跨境电商
2020/03/05 全球购物
总经理助理的八要求
2013/11/12 职场文书
关于毕业的中学校园广播稿
2014/01/26 职场文书
小学英语教学反思
2014/01/30 职场文书
精彩的英文自荐信
2014/01/30 职场文书
1亿有多大教学反思
2014/05/01 职场文书
养成教育经验材料
2014/05/26 职场文书
2014教师评职称工作总结
2014/11/10 职场文书
幼儿园托班开学寄语(2016秋季)
2015/12/03 职场文书
Python获取字典中某个key的value
2022/04/13 Python