JavaScript setTimeout使用闭包功能实现定时打印数值

 更新时间:2015年12月18日 14:15:42   作者:喜爱编程的人  
这篇文章主要介绍了JavaScript setTimeout使用闭包功能实现定时打印数值 的相关资料,需要的朋友可以参考下

我们这次使用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) 
 }); 

由于使用了闭包,也简单了很多,检查错误也很容易了

相关文章

  • 鼠标滚轮编程

    鼠标滚轮编程

    鼠标滚轮编程...
    2007-01-01
  • 使用JS获取页面上的所有标签

    使用JS获取页面上的所有标签

    这篇文章主要介绍了使用JS获取页面上的所有标签 ,需要的朋友可以参考下
    2018-10-10
  • 关于JS中的全等和不全等、等于和不等于问题

    关于JS中的全等和不全等、等于和不等于问题

    等号和非等号的同类运算符是全等号和非全等号。这两个运算符所做的与等号和非等号相同,只是它们在检查相等性前,不执行类型转换。接下来通过本文给大家介绍JS中的全等和不全等、等于和不等于,一起看看吧
    2021-09-09
  • MC Dialog js弹出层 完美兼容多浏览器(5.6更新)

    MC Dialog js弹出层 完美兼容多浏览器(5.6更新)

    MC.Dialog 是由肖毅(YesSky) 开发一款界面绚丽美观 操作简单易用的一款js弹出层 MC.Dialog 是经过严格了测试的 兼容目前ie7+ 以及其他非ie核心的浏览器 完美模拟浏览器自带对话框功能
    2010-05-05
  • 浅析如何利用JavaScript进行语音识别

    浅析如何利用JavaScript进行语音识别

    所谓语音识别就是将你所说的转化成文字。Chrome 浏览器在版本25之后开始对这一特性的支持。这篇文章将会详细的介绍如何使用JavaScript进行语音识别,感兴趣的朋友们可以参考借鉴,下面来一起看看吧。
    2016-10-10
  • JavaScript实现图片懒加载(Lazyload)

    JavaScript实现图片懒加载(Lazyload)

    这篇文章主要介绍了JavaScript实现图片懒加载(Lazyload)的相关资料,需要的朋友可以参考下
    2016-11-11
  • xmlhttp缓存清除的2种解决方法

    xmlhttp缓存清除的2种解决方法

    这篇文章主要介绍了xmlhttp缓存清除的2种解决方法。需要的朋友可以过来参考下,希望对大家有所帮助
    2013-12-12
  • 详解如何优雅迭代JavaScript字面对象

    详解如何优雅迭代JavaScript字面对象

    迭代是访问集合元素的一种方法,可以被迭代的对象称为可迭代对象,下面这篇文章主要给大家介绍了关于如何优雅迭代JavaScript字面对象的相关资料,需要的朋友可以参考下
    2022-05-05
  • JS实现仿FLASH效果的竖排导航代码

    JS实现仿FLASH效果的竖排导航代码

    这篇文章主要介绍了JS实现仿FLASH效果的竖排导航代码,涉及JavaScript基于定时函数动态设置页面元素样式的技巧,具有FLASH变换效果,需要的朋友可以参考下
    2015-09-09
  • js操作checkbox遇到的问题解决

    js操作checkbox遇到的问题解决

    这篇文章介绍了js操作checkbox遇到的问题解决,有需要的朋友可以参考一下
    2013-06-06

最新评论