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 Tips(4) 一些关于提高JQuery性能的Tips
Dec 19 Javascript
图像替换新技术 状态域方法
Jan 28 Javascript
javascript,jquery闭包概念分析
Jun 19 Javascript
利用JS来控制键盘的上下左右键(示例代码)
Dec 14 Javascript
js中top的作用深入剖析
Mar 04 Javascript
javascript浏览器兼容教程之事件处理
Jun 09 Javascript
Ext4.2的Ext.grid.plugin.RowExpander无法触发事件解决办法
Aug 15 Javascript
jquery ajax加载数据前台渲染方式 不用for遍历的方法
Aug 09 jQuery
vue头部导航动态点击处理方法
Nov 02 Javascript
vue自定义指令directive的使用方法
Apr 07 Javascript
ES6知识点整理之对象解构赋值应用示例
Apr 17 Javascript
使用Vant完成通知栏Notify的提示操作
Nov 11 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 注册时输入信息验证器的实现详解
2013/07/05 PHP
在Mac OS上编译安装Nginx+PHP+MariaDB开发环境的教程
2016/02/23 PHP
PHP会话操作之cookie用法分析
2016/09/28 PHP
COM中获取JavaScript数组大小的代码
2009/11/22 Javascript
Javascript中this关键字的一些小知识
2015/03/15 Javascript
关于JS中match() 和 exec() 返回值和属性的测试
2016/03/21 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
2016/05/16 Javascript
javascript实现页面滚屏效果
2017/01/17 Javascript
微信小程序 仿美团分类菜单 swiper分类菜单
2017/04/12 Javascript
在React 组件中使用Echarts的示例代码
2017/11/08 Javascript
让 babel webpack vue 配置文件支持智能提示的方法
2019/06/22 Javascript
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
2019/09/23 Javascript
Vue中使用wangeditor富文本编辑的问题
2021/02/07 Vue.js
Python命令行参数解析模块optparse使用实例
2015/04/13 Python
Python使用pickle模块实现序列化功能示例
2018/07/13 Python
Python 中的lambda函数介绍
2018/10/10 Python
对Python信号处理模块signal详解
2019/01/09 Python
详解Python 切片语法
2019/06/10 Python
Python中面向对象你应该知道的一下知识
2019/07/10 Python
浅谈Python中函数的定义及其调用方法
2019/07/19 Python
django 取消csrf限制的实例
2020/03/13 Python
Python图片处理模块PIL操作方法(pillow)
2020/04/07 Python
pyCharm 实现关闭代码检查
2020/06/09 Python
selenium3.0+python之环境搭建的方法步骤
2021/02/01 Python
办理信用卡工作证明
2014/01/11 职场文书
个人投资计划书
2014/05/01 职场文书
2014购房个人委托书范本
2014/10/12 职场文书
实习介绍信模板
2015/01/30 职场文书
共青团员自我评价
2015/03/10 职场文书
2015年建筑工程工作总结
2015/05/13 职场文书
2015年公司国庆放假通知
2015/07/30 职场文书
2016年春节慰问信息大全
2015/11/30 职场文书
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL
详解NodeJS模块化
2021/06/15 NodeJs
详解Java实现数据结构之并查集
2021/06/23 Java/Android
关于的python五子棋的算法
2022/05/02 Python