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插件easyUi表单验证提交(示例代码)
Dec 30 Javascript
函数式 JavaScript(一)简介
Jul 07 Javascript
javascript实现淡蓝色的鼠标拖动选择框实例
May 09 Javascript
老生常谈JQuery data方法的使用
Sep 09 Javascript
JS实现直接运行html代码的方法
Mar 13 Javascript
require.js中的define函数详解
Jul 10 Javascript
NW.js 简介与使用方法
Feb 01 Javascript
小程序scroll-view组件实现滚动的示例代码
Sep 20 Javascript
Postman的下载及安装教程详解
Oct 16 Javascript
vue 判断元素内容是否超过宽度的方式
Jul 29 Javascript
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
Feb 11 Vue.js
Vue-router编程式导航的两种实现代码
Mar 04 Vue.js
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+oracle 分页类
2006/10/09 PHP
PHP 批量删除数据的方法分析
2009/10/30 PHP
php 抽象类的简单应用
2011/09/06 PHP
php批量更改数据库表前缀实现方法
2013/10/26 PHP
PhpDocumentor 2安装以及生成API文档的方法
2014/05/21 PHP
thinkPHP事务操作简单案例分析
2019/10/17 PHP
imgAreaSelect 中文文档帮助说明
2011/10/08 Javascript
js检查页面上有无重复id的实现代码
2013/07/17 Javascript
什么是Node.js?Node.js详细介绍
2014/06/01 Javascript
js+css实现文字散开重组动画特效代码分享
2015/08/21 Javascript
js+ajax实现获取文件大小的方法
2015/12/08 Javascript
js仿支付宝填写支付密码效果实现多方框输入密码
2016/03/09 Javascript
jQuery基础知识点总结(DOM操作)
2016/06/01 Javascript
基于Bootstrap和jQuery构建前端分页工具实例代码
2016/11/23 Javascript
jquery事件与绑定事件
2017/03/16 Javascript
vue-cli项目中怎么使用mock数据
2017/09/27 Javascript
Angular搜索 过滤 批量删除 添加 表单验证功能集锦(实例代码)
2017/10/25 Javascript
如何让你的JS代码更好看易读
2017/12/01 Javascript
如何把vuejs打包出来的文件整合到springboot里
2018/07/26 Javascript
实现Vue的markdown文档可以在线运行的方法示例
2018/12/11 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
抖音上用记事本编写爱心小程序教程
2019/04/17 Javascript
vuex实现购物车的增加减少移除
2020/06/28 Javascript
JavaScript中arguments的使用方法详解
2020/12/20 Javascript
举例讲解Python面相对象编程中对象的属性与类的方法
2016/01/19 Python
python网络编程调用recv函数完整接收数据的三种方法
2017/03/31 Python
python实现飞机大战微信小游戏
2020/03/21 Python
python3.9实现pyinstaller打包python文件成exe
2020/12/13 Python
万豪国际住宅与别墅集团:Homes & Villas by Marriott International
2020/10/08 全球购物
最新销售员个人自荐信
2013/09/21 职场文书
创业者迈进成功第一步:如何写创业计划书?
2014/03/22 职场文书
学校禁毒宣传活动总结
2015/05/08 职场文书
教师聘用意向书
2015/05/11 职场文书
初中数学教学随笔
2015/08/15 职场文书
IDEA 链接Mysql数据库并执行查询操作的完整代码
2021/05/20 MySQL
JavaScript实现简单计时器
2021/06/22 Javascript