`
towaywu
  • 浏览: 16259 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

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值,就都不会一样.所以就是达到我们的想要的结果.


本文属于吴统威的博客,微信公众号:bianchengderen,:186659233的原创文章,转载时请注明出处及相应链接:http://www.wutongwei.com/front/infor_showone.tweb?id=161 ,欢迎大家传播与分享.

分享到:
评论

相关推荐

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

    利用闭包的功能,我们可以实现使用`setTimeout`来定时打印数值的需求。 首先,我们来看看为什么要使用闭包来实现这个功能。在JavaScript中,`setTimeout`会将传入的函数推迟到指定的时间后执行,但这并不意味着函数...

    js代码-定时嵌套函数

    JavaScript中的定时嵌套函数是一种常见的编程技巧,常用于实现复杂的定时任务或异步操作的控制流程。在这篇文章中,我们将深入探讨定时器(setTimeout和setInterval)与嵌套函数的结合使用,以及它们在实际应用中的...

    15个非常实用的JavaScript代码片段

    打印页面的功能在JavaScript中可以通过 `window.print()` 实现,这在需要用户打印页面内容时非常有用。 DOM元素的显示与隐藏可以通过修改其样式属性 `display` 来控制,`el.style.display = "";` 会显示元素,而 `...

    Ultimate-cookie-clicker

    在"Ultimate-cookie-clicker"中,JavaScript主要负责游戏逻辑的实现,包括事件监听、数据计算、UI更新等核心功能。例如,当用户点击屏幕时,JavaScript会捕获这个点击事件,并执行相应的计数和升级逻辑。 在事件...

    INT203_62130500062_groupwork_5

    4. **原型与继承**:JavaScript使用原型链实现对象间的继承,每个对象都有一个__proto__属性,指向创建它的构造函数的原型对象。此外,还可以通过Object.create()或class语法实现继承。 5. **异步编程**:...

Global site tag (gtag.js) - Google Analytics