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实现运行代码需要刷新的解决方法
Aug 18 Javascript
JQuery index()方法使用代码
Jun 02 Javascript
IE6图片加载的一个BUG解决方法
Jul 13 Javascript
关于html+ashx开发中几个问题的解决方法
Jul 18 Javascript
jQuery窗口、文档、网页各种高度的精确理解
Jul 02 Javascript
javascript折半查找详解
Jan 26 Javascript
基于javascript制作微信聊天面板
Aug 09 Javascript
js对象浅拷贝和深拷贝详解
Sep 05 Javascript
浅谈jQuery before和insertBefore的区别
Dec 04 Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
Jul 16 Javascript
vue-列表下详情的展开与折叠案例
Jul 28 Javascript
解决ant design vue 表格a-table二次封装,slots渲染的问题
Oct 28 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冒泡排序算法的深入理解
2013/06/09 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
2014/03/18 PHP
JavaScript触发器详解
2007/03/10 Javascript
一个符号插入器 中用到的js代码
2007/09/04 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
2011/03/17 Javascript
基于Jquery插件开发之图片放大镜效果(仿淘宝)
2011/11/19 Javascript
showModelDialog弹出文件下载窗口的使用示例
2013/11/19 Javascript
jQuery插件开发详细教程
2014/06/06 Javascript
javascript实现客户端兼容各浏览器创建csv并下载的方法
2015/03/23 Javascript
javascript实现控制浏览器全屏
2015/03/30 Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
2016/06/08 Javascript
jQuery数组处理函数整理
2016/08/03 Javascript
简单理解vue中Props属性
2016/10/27 Javascript
javascript实现根据函数名称字符串动态执行函数的方法示例
2016/12/28 Javascript
JS实现websocket长轮询实时消息提示的效果
2017/10/10 Javascript
vue调试工具vue-devtools安装及使用方法
2018/11/07 Javascript
vue实现的下拉框功能示例
2019/01/29 Javascript
ES6 Object属性新的写法实例小结
2019/06/25 Javascript
JSONP解决JS跨域问题的实现
2020/05/25 Javascript
JS实现拖动模糊框特效
2020/08/25 Javascript
[01:35]2014DOTA2西雅图邀请赛 专访狐狸妈青春献给刀塔
2014/07/08 DOTA
[01:08:56]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第一场 2月7日
2021/03/11 DOTA
python面向对象法实现图书管理系统
2019/04/19 Python
Python音频操作工具PyAudio上手教程详解
2019/06/26 Python
PyCharm使用之配置SSH Interpreter的方法步骤
2019/12/26 Python
Transpose 数组行列转置的限制方式
2020/02/11 Python
Python模拟伯努利试验和二项分布代码实例
2020/05/27 Python
python获取系统内存占用信息的实例方法
2020/07/17 Python
python解决OpenCV在读取显示图片的时候闪退的问题
2021/02/23 Python
作为网站管理者应当如何防范XSS
2014/08/16 面试题
高级电工工作职责
2013/11/21 职场文书
测绘工程专业个人自我评价
2013/12/01 职场文书
庆元旦文艺演出主持词
2014/03/27 职场文书
学校元旦晚会开场白
2014/12/14 职场文书
2016年感恩父亲节活动总结
2016/04/01 职场文书
JAVA springCloud项目搭建流程
2022/05/11 Java/Android