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 相关文章推荐
javascript中call和apply方法浅谈
Sep 27 Javascript
Javascript表单验证要注意的事项
Sep 29 Javascript
jQuery原型属性和原型方法详解
Jul 07 Javascript
Bootstrap进度条实现代码解析
Mar 07 Javascript
jQuery Json数据格式排版高亮插件json-viewer.js使用方法详解
Jun 12 jQuery
基于ajax和jsonp的原生封装(实例)
Oct 16 Javascript
基于JavaScript中字符串的match与replace方法(详解)
Dec 04 Javascript
react-router browserHistory刷新页面404问题解决方法
Dec 29 Javascript
vue用递归组件写树形控件的实例代码
Jul 19 Javascript
JavaScript设计模式之原型模式分析【ES5与ES6】
Jul 26 Javascript
微信js-sdk 录音功能的示例代码
Nov 01 Javascript
vue.js实现简单的计算器功能
Feb 22 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地址范围的方法
2015/03/31 PHP
静态页面下用javascript操作ACCESS数据库(读增改删)的代码
2007/05/14 Javascript
javascript 命名空间以提高代码重用性
2008/11/13 Javascript
js substring从右边获取指定长度字符串(示例代码)
2013/12/23 Javascript
整理Javascript数组学习笔记
2015/11/29 Javascript
jQuery实现响应鼠标事件的图片透明效果【附demo源码下载】
2016/06/16 Javascript
jquery实现跳到底部,回到顶部效果的简单实例(类似锚)
2016/07/10 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
2017/01/04 Javascript
canvas的神奇用法
2017/02/03 Javascript
深入理解JavaScript中的for循环
2017/02/07 Javascript
js控制文本框禁止输入特殊字符详解
2017/04/07 Javascript
关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用详解
2017/05/12 Javascript
通过js控制时间,一秒一秒自己动的实例
2017/10/25 Javascript
JavaScript内存泄漏的处理方式
2017/11/20 Javascript
微信小程序有旋转动画效果的音乐组件实例代码
2018/08/22 Javascript
3分钟读懂移动端rem使用方法(推荐)
2019/05/06 Javascript
vue 组件中使用 transition 和 transition-group实现过渡动画
2019/07/09 Javascript
js实现车辆管理系统
2020/08/26 Javascript
React Ant Design树形表格的复杂增删改操作
2020/11/02 Javascript
[02:45]DOTA2英雄基础教程 伐木机
2013/12/23 DOTA
决策树的python实现方法
2014/11/18 Python
用Python进行一些简单的自然语言处理的教程
2015/03/31 Python
Python机器学习之SVM支持向量机
2017/12/27 Python
基于Python开发chrome插件的方法分析
2018/07/07 Python
对pandas处理json数据的方法详解
2019/02/08 Python
使用python实现离散时间傅里叶变换的方法
2019/09/02 Python
Python中使用threading.Event协调线程的运行详解
2020/05/02 Python
浅谈Python里面None True False之间的区别
2020/07/09 Python
详解python算法常用技巧与内置库
2020/10/17 Python
与UNIX有关的几个名词
2015/09/17 面试题
财务人员个人求职信范文
2013/12/04 职场文书
现金出纳岗位职责
2014/03/15 职场文书
重大事项社会稳定风险评估方案
2014/06/15 职场文书
执法作风整顿剖析材料
2014/10/11 职场文书
教师年终个人总结
2015/02/11 职场文书
JavaScript利用html5新方法操作元素类名详解
2021/11/27 Javascript