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 相关文章推荐
最佳JS代码编写的14条技巧
Jan 09 Javascript
js日期范围初始化得到前一个月日期的方法
May 05 Javascript
node.js中格式化数字增加千位符的几种方法
Jul 03 Javascript
浅析JavaScript 调试方法和技巧
Oct 22 Javascript
jQuery中deferred对象使用方法详解
Jul 14 Javascript
深入浅出 jQuery中的事件机制
Aug 23 Javascript
Vuejs第六篇之Vuejs与form元素实例解析
Sep 05 Javascript
jquery文字填写自动高度的实现方法
Nov 07 Javascript
详解Angular.js中$http拦截器的介绍及使用
Jul 04 Javascript
JS实现的简单分页功能示例
Aug 23 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
Dec 06 Javascript
JS绘图Flot如何实现动态可刷新曲线图
Oct 16 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
如何使用脚本模仿登陆过程
2006/11/22 PHP
php格式化日期实例分析
2014/11/12 PHP
PHP工程师VIM配置分享
2015/12/15 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
PHP获取对象属性的三种方法实例分析
2019/01/03 PHP
laravel 解决crontab不执行的问题
2019/10/22 PHP
Avengerls vs Newbee BO3 第一场2.18
2021/03/10 DOTA
Node.js Sequelize如何实现数据库的读写分离
2016/10/23 Javascript
Nodejs进阶:核心模块net入门学习与实例讲解
2016/11/21 NodeJs
jQuery基于ajax操作json数据简单示例
2017/01/05 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
2017/08/08 jQuery
JavaScript实现HTML5游戏断线自动重连的方法
2017/09/18 Javascript
Vue.js实现的表格增加删除demo示例
2018/05/22 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
vue表单验证你真的会了吗?vue表单验证(form)validate
2019/04/07 Javascript
JavaScript 面向对象基础简单示例
2019/10/02 Javascript
基于JavaScript实现留言板功能
2020/03/16 Javascript
详解js中的几种常用设计模式
2020/07/16 Javascript
vue中用 async/await 来处理异步操作
2020/07/18 Javascript
Python框架Flask的基本数据库操作方法分析
2018/07/13 Python
Python读写文件基础知识点
2019/06/10 Python
如何更优雅地写python代码
2019/07/02 Python
利用python list完成最简单的DB连接池方法
2019/08/09 Python
python实现指定ip端口扫描方式
2019/12/17 Python
pytorch 归一化与反归一化实例
2019/12/31 Python
Python的collections模块真的很好用
2021/03/01 Python
简单聊聊H5的pushState与replaceState的用法
2018/04/03 HTML / CSS
环卫工人先进事迹材料
2014/06/02 职场文书
解除施工合同协议书
2014/10/17 职场文书
房屋买卖协议样本
2014/11/16 职场文书
公务员个人考察材料
2014/12/23 职场文书
食品仓管员岗位职责
2015/04/01 职场文书
公司人力资源管理制度
2015/08/05 职场文书
Flask response响应的具体使用
2021/07/15 Python
SpringBoot整合Mybatis Generator自动生成代码
2021/08/23 Java/Android
PHP RabbitMQ消息列队
2022/05/11 PHP