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 相关文章推荐
jquery 1.3.2 IE8中的一点点的小问题解决方法
Jul 10 Javascript
JQUERY的属性选择符和自定义选择符使用方法(二)
Apr 07 Javascript
控制台报错object is not a function的解决方法
Aug 24 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
Jan 31 Javascript
JavaScript中的分号插入机制详细介绍
Feb 11 Javascript
基于jquery实现简单的手风琴特效
Nov 24 Javascript
酷炫jQuery全屏3D焦点图动画效果
Mar 22 Javascript
canvas实现探照灯效果
Feb 07 Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
Aug 31 Javascript
对angular 监控数据模型变化的事件方法$watch详解
Oct 09 Javascript
ES6 Object.assign()的用法及其使用
Jan 18 Javascript
Vue列表如何实现滚动到指定位置样式改变效果
May 09 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
discuz图片顺序混乱解决方案
2015/07/29 PHP
CI框架支持$_GET的两种实现方法
2016/05/18 PHP
php使用include 和require引入文件的区别
2017/02/16 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
JQuery,Extjs,YUI,Prototype,Dojo 等JS框架的区别和应用场景简述
2010/04/15 Javascript
超级简单的jquery操作表格方法
2014/12/15 Javascript
javascript面向对象之对象的深入理解
2015/01/13 Javascript
详解Angular中$cacheFactory缓存的使用
2016/08/19 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
2017/01/21 Javascript
JavaScript字符串检索字符的方法
2017/06/23 Javascript
vue axios同步请求解决方案
2017/09/29 Javascript
html中通过JS获取JSON数据并加载的方法
2017/11/30 Javascript
vue+iview 兼容IE11浏览器的实现方法
2019/01/07 Javascript
微信小程序云开发 生成带参小程序码流程
2019/05/18 Javascript
layui数据表格实现重载数据表格功能(搜索功能)
2019/07/27 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
vue利用全局导航守卫作登录后跳转到未登录前指定页面的实例代码
2020/05/19 Javascript
js实现双色球效果
2020/08/02 Javascript
[02:54]DOTA2亚洲邀请赛 VG战队出场宣传片
2015/02/07 DOTA
python基于xmlrpc实现二进制文件传输的方法
2015/06/02 Python
Python 3.x 连接数据库示例(pymysql 方式)
2017/01/19 Python
pandas 对每一列数据进行标准化的方法
2018/06/09 Python
Python 基于wxpy库实现微信添加好友功能(简洁)
2019/11/29 Python
Python字典底层实现原理详解
2019/12/18 Python
python中如何打包用户自定义模块
2020/09/23 Python
Python绘图实现台风路径可视化代码实例
2020/10/23 Python
Canvas绘制浮动球效果的示例
2017/12/29 HTML / CSS
allbeauty美国:英国在线美容店
2019/03/11 全球购物
德国高尔夫商店:Par71.de
2020/11/29 全球购物
工作收入住址证明
2014/10/28 职场文书
2014年体育教学工作总结
2014/12/09 职场文书
三八妇女节致辞
2015/07/31 职场文书
新学期感想
2015/08/10 职场文书
2019同学聚会主持词
2019/05/06 职场文书
hive数据仓库新增字段方法
2022/06/25 数据库
html原生table实现合并单元格以及合并表头的示例代码
2023/05/07 HTML / CSS