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的jqDnR拖拽溢出的修改
Feb 12 Javascript
Javascript 垃圾收集机制介绍理解
May 14 Javascript
原生Js实现简易烟花爆炸效果的方法
Mar 20 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
Sep 15 Javascript
深入浅析AngularJS和DataModel
Feb 16 Javascript
Node.js中的require.resolve方法使用简介
Apr 23 Javascript
详解vue渲染函数render的使用
Dec 12 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
Aug 24 Javascript
jQuery实现基本隐藏与显示效果的方法详解
Sep 05 jQuery
Jquery的Ajax技术使用方法
Jan 21 jQuery
移动端JS实现拖拽两种方法解析
Oct 12 Javascript
js实现详情页放大镜效果
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 - Html Transfer Code
2006/10/09 PHP
php 信息采集程序代码
2009/03/17 PHP
php程序总是提示验证码输入有误解决方案
2015/01/07 PHP
Thinkphp3.2.3分页使用实例解析
2016/07/28 PHP
在chrome中window.onload事件的一些问题
2010/03/01 Javascript
EasyUi tabs的高度与宽度根据IE窗口的变化自适应代码
2010/10/26 Javascript
Javascript中 关于prototype属性实现继承的原理图
2013/04/16 Javascript
Function.prototype.call.apply结合用法分析示例
2013/07/03 Javascript
js限制文本框只能输入整数或者带小数点的数字
2015/04/27 Javascript
深入浅出分析javaScript中this用法
2015/05/09 Javascript
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
2015/08/04 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
2016/09/14 Javascript
JS添加或修改控件的样式(Class)实现方法
2016/10/15 Javascript
零基础轻松学JavaScript闭包
2016/12/30 Javascript
详解vue-cli + webpack 多页面实例应用
2017/04/25 Javascript
基于Vue实例生命周期(全面解析)
2017/08/16 Javascript
微信小程序自定义导航教程(兼容各种手机)
2018/12/12 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
2019/05/24 Javascript
VUE组件中的 Drawer 抽屉实现代码
2019/08/06 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
2019/12/16 Javascript
Vue绑定用户接口实现代码示例
2020/11/04 Javascript
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
2021/01/13 Vue.js
全面解析Python的While循环语句的使用方法
2015/10/13 Python
python用户管理系统
2018/03/13 Python
Python实现简单层次聚类算法以及可视化
2019/03/18 Python
用 python 进行微信好友信息分析
2020/11/28 Python
Parts Express:音频、视频和扬声器的第一来源
2017/04/25 全球购物
新西兰珠宝品牌:Michael Hill
2017/09/16 全球购物
欧洲领先的电子和电信零售商和服务提供商:Currys PC World Business
2017/12/05 全球购物
法国在线药房:DoctiPharma
2020/10/21 全球购物
岗位廉政承诺书
2014/03/27 职场文书
揭牌仪式策划方案
2014/05/28 职场文书
任命书格式
2014/06/05 职场文书
银行反洗钱宣传活动总结
2015/05/08 职场文书
用Python仅20行代码编写一个简单的端口扫描器
2022/04/08 Python
Spring 使用注解开发
2022/05/20 Java/Android