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

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

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索settimeout闭包
settimeout定时
settimeout 闭包、js settimeout 闭包、js定时器settimeout、清除settimeout定时器、settimeout定时器,以便于您获取更多的相关知识。

时间: 2024-10-23 23:36:31

JavaScript setTimeout使用闭包功能实现定时打印数值_javascript技巧的相关文章

常用Javascript函数与原型功能收藏(必看篇)_javascript技巧

如下所示: // 重复字符串 String.prototype.repeat = function(n) { return new Array(n+1).join(this); } // 替换全部 String.prototype.replaceAll = function(str1, str2) { return this.replace(new RegExp(str1, "gm"), str2); } // 清除空格 String.prototype.trim = function

JavaScript蒙板(model)功能的简单实现代码_javascript技巧

思路: •创建一个蒙板, 设置蒙板的堆叠顺序保证能将其它元素盖住 position: absolute; top: 0; left: 0; display: none; background-color: rgba(9, 9, 9, 0.63); width: 100%; height: 100%; z-index: 1000; •设置蒙板中内容的背景色和展示格式 width: 50%; text-align: center; background: #ffffff; border-radius

谈谈我对JavaScript原型和闭包系列理解(随手笔记8)_javascript技巧

在上篇文章给大家介绍了<谈谈我对JavaScript原型和闭包系列理解(随手笔记6)>, 谈谈我对JavaScript原型和闭包系列理解(随手笔记9)     可以点击了解详情. 执行上下文栈 执行全局代码时,会产生一个执行上下文环境,每次调用函数都又会产生执行上下文环境.当函数调用完成时,这个上下文环境以及其中的数据都会被消除,再重新回到全局上下文环境.处于活动状态的执行上下文环境只有一个. 压栈出栈过程----执行上下文栈: var a = 10, //1. 进入全局上下文环境 fn, b

谈谈我对JavaScript原型和闭包系列理解(随手笔记9)_javascript技巧

相关阅读:谈谈我对JavaScript原型和闭包系列理解(随手笔记6)   谈谈我对JavaScript原型和闭包系列理解(随手笔记8) 作用域 引用<JavaScript语言精粹和编程实践>上对作用域的定义: 变量作用域又叫变量的可见性.变量作用域完成对信息的隐蔽,也就是处理"割据"问题. js中是没有块级作用域的(ES6中有一个let,可以在{},if,for里面声明,同时作用域限定在块级.let声明的变量不存在变量提升!这里不谈论这个,因为我也是偶然看到.). 我们在

使用javascript实现监控视频播放并打印日志_javascript技巧

最近在做一个项目,要求监控视频的播放事件并能够打印LOG日志,经过一番思索,使用javascript实现了此功能,代码如下: HTML: 复制代码 代码如下: <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>Multi Source</tit

利用WebBrowser彻底解决Web打印问题(包括后台打印)_javascript技巧

抱着"取之于众 服务于众"的思想,我总结了一下,把它拿到网上来与大家分享,希望能帮助遇到类似问题的朋友. 我主要使用了IE内置的WebBrowser控件,无需用户下载和安装.WebBrowser有很多功能,除打印外的其他功能就不再赘述了,你所能用到的打印功能也几乎全部可以靠它完成,下面的问题就是如何使用它了.先说显示后打印,后面说后台打印. 1.首先引入一个WebBrowser在需要打印的页面,可以直接添加: <object id="WebBrowser" c

JavaScript闭包和范围实例详解_javascript技巧

本文实例分析了JavaScript闭包和范围.分享给大家供大家参考,具体如下: 1. if (!("a" in window)) { var a = 1; } alert(a); [分析]代码含义:如果window不包含属性a,就声明一个变量a并赋值为1 ①JS引擎会先扫描所有的变量声明 ②所有的全局变量都是window的属性 ③变量声明和赋值一起用时,Js引擎会自动将它分成两部分:变量声明提前,变量赋值没有(不将赋值提前是因为他有可能影响代码执行出不可预期的结果) 所以代码执行顺序等

javascript闭包(Closure)用法实例简析_javascript技巧

本文实例讲述了javascript闭包(Closure)用法.分享给大家供大家参考,具体如下: closure被翻译成"闭包",感觉这东西被包装的太学术化.下面参考书本和网上资源简单探讨一下(理解不当之处务请留意). 1.什么是闭包 官方的回答:所谓"闭包",指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 看了上面的定义,如果你不是高手,我坚信你会和我一样愤怒的质问:这tmd是人话吗? 要理解闭包,还是代码

JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍_javascript技巧

cookie是网站设计者放置在客户端(浏览器)的小文本文件,cookie不仅能够实现保存密码功能,还可以通过cookie保存最近浏览记录增加用户体验. 在登录界面添加记住密码功能,我首先想到的是在java后台中调用cookie存放账号密码,大致如下: HttpServletRequest request HttpServletResponse response Cookie username = new Cookie("username ","cookievalue"