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 相关文章推荐
Javasipt:操作radio标签详解
Dec 30 Javascript
jquery使用ajax实现微信自动回复插件
Apr 28 Javascript
初识Node.js
Sep 03 Javascript
浅谈重写window对象的方法
Dec 29 Javascript
简介JavaScript中strike()方法的使用
Jun 08 Javascript
js鼠标点击按钮切换图片-图片自动切换-点击左右按钮切换特效代码
Sep 02 Javascript
JS hashMap实例详解
May 26 Javascript
微信小程序 require机制详解及实例代码
Dec 14 Javascript
vue.js开发实现全局调用的MessageBox组件实例代码
Nov 22 Javascript
使用electron将vue-cli项目打包成exe的方法
Sep 29 Javascript
vue 解决computed修改data数据的问题
Nov 06 Javascript
详解elementUI中input框无法输入的问题
Apr 27 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 获取客户端真实IP地址多种方法小结
2010/05/15 PHP
PHP面向对象法则
2012/02/23 PHP
php使用curl并发减少后端访问时间的方法分析
2016/05/12 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
PHP序列化和反序列化深度剖析实例讲解
2020/12/29 PHP
JavaScript 对Cookie 操作的封装小结
2009/12/31 Javascript
利用Javascript判断操作系统的类型实现不同操作系统下的兼容性
2013/01/29 Javascript
javascript实现tabs选项卡切换效果(扩展版)
2013/03/19 Javascript
jquery实现的可隐藏重现的靠边悬浮层实例代码
2013/05/27 Javascript
详细解读AngularJS中的表单验证编程
2015/06/19 Javascript
VUE实现日历组件功能
2017/03/13 Javascript
angularjs实现过滤并替换关键字小功能
2017/09/19 Javascript
vuex与组件联合使用的方法
2018/05/10 Javascript
JS替换字符串中指定位置的字符(多种方法)
2020/05/28 Javascript
Python ValueError: invalid literal for int() with base 10 实用解决方法
2015/06/21 Python
python实现决策树
2017/12/21 Python
Python设计模式之工厂模式简单示例
2018/01/09 Python
Python使用Phantomjs截屏网页的方法
2018/05/17 Python
pyspark操作MongoDB的方法步骤
2019/01/04 Python
Django+Xadmin构建项目的方法步骤
2019/03/06 Python
如何使用Flask-Migrate拓展数据库表结构
2019/07/24 Python
Python数据可视化实现正态分布(高斯分布)
2019/08/21 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
2019/09/16 Python
python打开使用的方法
2019/09/30 Python
基于python实现学生信息管理系统
2019/11/22 Python
使用python远程操作linux过程解析
2019/12/04 Python
网页切图的CSS和布局经验与要点
2015/04/09 HTML / CSS
巧用 CSS3的webkit-box-reflect 倒影实现各类动效
2021/03/05 HTML / CSS
如何在Canvas上的图形/图像绑定事件监听的实现
2020/09/16 HTML / CSS
计算机专业毕业生的自我评价
2013/11/18 职场文书
教师廉洁自律承诺书
2014/05/26 职场文书
观看信仰心得体会
2014/09/04 职场文书
学习党代会心得体会
2014/09/05 职场文书
2014年最新大专生职业生涯规划书范文
2014/09/13 职场文书
单位法定代表人授权委托书
2014/09/20 职场文书
遗嘱范文
2015/08/07 职场文书