当前位置: 首页 > 编程笔记 >

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

郑高驰
2023-03-14
本文向大家介绍JavaScript setTimeout使用闭包功能实现定时打印数值,包括了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) 
 }); 

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

 类似资料:
  • 问题内容: 我最近切换了操作系统,并正在使用较新的Python(2.7)。在旧系统上,我曾经能够即时打印。例如,假设我有一个计算密集的for循环: 然后当代码完成每次迭代时,它将打印 但是,在我当前的系统上,python似乎缓存了stdout,因此终端空白了几分钟,然后输出: 短期内。然后,几分钟后,它将打印: 等等。如何在到达语句后立即进行python打印? 问题答案: 尝试在打印后调用冲洗标准

  • 本文向大家介绍Android实现PDF预览打印功能,包括了Android实现PDF预览打印功能的使用技巧和注意事项,需要的朋友参考一下 最近在做一个项目,需要用到android手机连接打印机进行打印的功能,目前在网上找到的教程介绍的都是蓝牙连接热敏打印机(pos机大小的打印机)和蓝牙打印机,如果连接日常所见到的网络打印机,进行打印,很显然这些教程是做不到的。 由于android没有提供任何标准,都

  • 问题内容: 我需要在另一个类的此Java应用程序中编写打印功能的帮助。 这些功能与printAll我认为是正确的,而其他功能肯定是错误的。 我将在下面写下此问题所需部分的全部功能。 由于实际上没有看到DictionaryADT令人困惑,因此我将其包含在此处。 问题答案: 如果DictionaryADT是具有所有实际实现的类,则需要调用 我相信您然后在DictionaryADT中有Map,类似 要获

  • 本文向大家介绍JS实现快递单打印功能【推荐】,包括了JS实现快递单打印功能【推荐】的使用技巧和注意事项,需要的朋友参考一下 最近做项目需要打印快递单,在网上搜索了一下发现直接给出代码的比较少。  首先说一下js网页打印的几种方法: 1.window.print() 会弹出打印对话框 2.使用html 标签引入Webbrowser控件  这种方式是其只兼容IE10以下的浏览器,其他浏览器不可使用 3

  • 本文向大家介绍PHP实现打包zip并下载功能,包括了PHP实现打包zip并下载功能的使用技巧和注意事项,需要的朋友参考一下 具体代码如下所示: 总结 以上所述是小编给大家介绍的PHP实现打包zip并下载功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐喊教程网站的支持!

  • 在移动端怎么实现pdf打印功能 尝试使用window.print() ios手机浏览器支持window.print,但是在企业微信里面不支持 安卓手机h5不支持window.print 有没有移动端h5实现打印功能的 还是说必须原生app来实现打印。