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带下拉菜单和焦点图代码分享
Aug 24 Javascript
bootstrap模态框消失问题的解决方法
Dec 02 Javascript
jQuery中的一些小技巧
Jan 18 Javascript
详解JavaScript数组过滤相同元素的5种方法
May 23 Javascript
vuex的使用及持久化state的方式详解
Jan 23 Javascript
解决Vue不能检测数组或对象变动的问题
Feb 24 Javascript
vue2.0+ 从插件开发到npm发布的示例代码
Apr 28 Javascript
Webpack的dll功能使用
Jun 28 Javascript
vue调试工具vue-devtools安装及使用方法
Nov 07 Javascript
微信小程序 slot踩坑的解决
Apr 01 Javascript
这15个Vue指令,让你的项目开发爽到爆
Oct 11 Javascript
JavaScript实现模态对话框实例
Jan 13 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和引用导致程序BUG的问题介绍
2012/09/05 PHP
windows环境下php配置memcache的具体操作步骤
2013/06/09 PHP
php对象和数组相互转换的方法
2015/05/12 PHP
新老版本juqery获取radio对象的方法
2010/03/01 Javascript
js select常用操作控制代码
2010/03/16 Javascript
jQuery+ajax实现无刷新级联菜单示例
2015/05/21 Javascript
jQuery实现鼠标划过添加和删除class的方法
2015/06/26 Javascript
javascript实现标签切换代码示例
2016/05/22 Javascript
使用bootstrap validator的remote验证代码经验分享(推荐)
2016/09/21 Javascript
JavaScript中的ajax功能的概念和示例详解
2016/10/17 Javascript
JavaScript纯色二维码变成彩色二维码
2020/07/23 Javascript
微信小程序实现美团菜单
2018/06/06 Javascript
vue 弹框产生的滚动穿透问题的解决
2018/09/21 Javascript
vue实现歌手列表字母排序下拉滚动条侧栏排序实时更新
2019/05/14 Javascript
基于ssm框架实现layui分页效果
2019/07/27 Javascript
js判断非127开头的IP地址的实例代码
2020/01/05 Javascript
JavaScript直接调用函数与call调用的区别实例分析
2020/05/22 Javascript
gearman的安装启动及python API使用实例
2014/07/08 Python
Python编程中的for循环语句学习教程
2015/10/14 Python
Python多线程扫描端口代码示例
2018/02/09 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
2018/05/15 Python
Python数据可视化:饼状图的实例讲解
2019/12/07 Python
在Python IDLE 下调用anaconda中的库教程
2020/03/09 Python
pymysql模块使用简介与示例
2020/11/17 Python
聊聊python在linux下与windows下导入模块的区别说明
2021/03/03 Python
南非领先的在线旅行社:Travelstart南非
2016/09/04 全球购物
naturalizer加拿大官网:美国娜然女鞋
2017/04/04 全球购物
捷克浴室和厨房设备购物网站:SIKO
2018/08/11 全球购物
美国体育用品商店:Academy Sports + Outdoors
2020/01/04 全球购物
保密普查工作实施方案
2014/02/25 职场文书
学校拾金不昧表扬信
2015/01/16 职场文书
公务员年度考核个人总结
2015/02/12 职场文书
金砖之国观后感
2015/06/11 职场文书
外出培训学习心得体会
2016/01/18 职场文书
QT连接MYSQL数据库的详细步骤
2021/07/07 MySQL
python3中apply函数和lambda函数的使用详解
2022/02/28 Python