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 相关文章推荐
document.getElementById介绍
Sep 13 Javascript
jquery键盘事件使用介绍
Nov 01 Javascript
jQuery中判断一个元素是否为另一个元素的子元素(或者其本身)
Mar 21 Javascript
JavaScript获取多个数组的交集简单实例
Nov 11 Javascript
JS将所有对象s的属性复制给对象r(原生js+jquery)
Jan 25 Javascript
js控制文本框输入的字符类型方法汇总
Jun 19 Javascript
JavaScript  event对象整理及详细介绍
Oct 10 Javascript
Vue方法与事件处理器详解
Dec 01 Javascript
JS设计模式之策略模式概念与用法分析
Feb 05 Javascript
浅析Vue项目中使用keep-Alive步骤
Jul 27 Javascript
javascript 内存模型实例详解
Apr 18 Javascript
javascript实现前端input密码输入强度验证
Jun 24 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不写闭合标签的好处
2014/03/04 PHP
VB中的RasEnumConnections函数返回632错误解决方法
2014/07/29 PHP
PHP中的魔术方法总结和使用实例
2015/05/11 PHP
WordPress的文章自动添加关键词及关键词的SEO优化
2016/03/01 PHP
PHP正则表达式函数preg_replace用法实例分析
2020/06/04 PHP
一个小型js框架myJSFrame附API使用帮助
2008/06/28 Javascript
40个有创意的jQuery图片、内容滑动及弹出插件收藏集之一
2011/12/31 Javascript
5款JavaScript代码压缩工具推荐
2014/07/07 Javascript
教你在heroku云平台上部署Node.js应用
2014/07/30 Javascript
JavaScript的removeChild()函数用法详解
2015/12/27 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
2017/05/17 Javascript
angular4强制刷新视图的方法
2018/10/09 Javascript
JS数组方法join()用法实例分析
2020/01/18 Javascript
VueX模块的具体使用(小白教程)
2020/06/05 Javascript
javaScript代码飘红报错看不懂?读完这篇文章再试试
2020/08/19 Javascript
vue中template的三种写法示例
2020/10/21 Javascript
Javascript实现单选框效果
2020/12/09 Javascript
[02:25]DOTA2英雄基础教程 虚空假面
2014/01/02 DOTA
对Python 网络设备巡检脚本的实例讲解
2018/04/22 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
2018/09/02 Python
Canvas 文字碰撞检测并抽稀的方法
2019/05/27 HTML / CSS
领先的钻石和订婚戒指零售商:Diamonds-USA
2016/12/11 全球购物
我们是伦敦女孩:WalG
2018/01/08 全球购物
维多利亚的秘密官方网站:Victoria’s Secret
2018/10/24 全球购物
AMAVII眼镜官网:时尚和设计师太阳镜
2019/05/05 全球购物
什么是聚集索引和非聚集索引
2012/01/17 面试题
护理自我鉴定范文
2013/10/06 职场文书
校本教研工作方案
2014/01/14 职场文书
运动会广播稿200米
2014/01/27 职场文书
商务英语专业求职信范文
2014/01/28 职场文书
护士岗位职责
2014/02/16 职场文书
高三毕业寄语
2014/04/10 职场文书
店铺转让协议书
2014/12/02 职场文书
祝酒词范文
2015/08/12 职场文书
学生检讨书范文
2019/06/24 职场文书
python通过新建环境安装tfx的问题
2022/05/20 Python