setInterval 和setTimeout 重新赋值clear的问题(下)

接着这个问题的(上),昨天说了一个我认为不完美的数组方法,后来觉得是基于我要实现的功能才显得不完美的,也许对不同需求却觉得有必要了。

废话少说,直接上方法:

 

下面是原代码

var timer;
 
 function t1(){
   timer = setInterval(function(){
   console.log("abc");
   },1000)
 }
  
 t1(); //执行一次
 //t1(); //再执行一次

 $(document).click(function(){
  clearTimeout(timer);
 })

  

  

  

 

数组引用方法:

var timer = [];
 
 function t1(){
   timer.push(setInterval(function(){
       console.log("abc");
   },1000))
 }
  
 t1(); //执行一次
 t1(); //再执行一次

 $(document).click(function(){
      clearTimeout(timer.pop());
 })

每生成一个新定时器,咱们push进timer数组集合,而每点击一次,我们又pop出一个定时器,clear掉。

这个方法显然好处在于我们可以逐渐增加定时器,也可以逐渐减少定时器,有点像加速减速作用,应该能实现某些运动。但如果要一次性clear掉所有的计时器,要用循环。

 

return 返回引用方法:

这个方法和数组如出一辙吧,在t1里面添加 return timer 结束。这样你可以用一个变量保存t1()的运行结果,然后clear掉这个变量。

个人觉得不可能每次都要生成一个变量来保存吧,还不如一个数组呢,所以我个人没看出它的优点在哪,也许存在只是作为我新手的我用不到。

代码就不贴出来了,很简单。

 

闭包引用方法:

这个方法其实只是稍微改动一下原来的代码,但是效果里面不一样了,代码如下:

            function t1(){
               var timer = setInterval(function(){
                   console.log("abc");
               },1000)
               $(document).click(function(){
                    clearTimeout(timer)
               })
            }
              
            t1(); //执行一次
            t1(); //再执行一次

只是简单的吧document的click方法写进了t1里面,这样无论t1执行多少次,我们点击document,所有的timer都被clear了。

闭包这个概念还是我半个月前理解的,没想到还能看出来这个方法利用了闭包。

也很简单,因为click方法被写进了t1里面,并且方法引用了timer变量,所以t1执行后,timer变量并没有被销毁,一直被click事件引用。

 

 

最后总结一下,其实这个问题产生的原因是失去了对计数器的引用,而以上三个方法都是针对保证了引用,所以我方法命令都是XX引用方法。

这些方法都是随手在google上看到,而我也只是随便扫了一眼,大致知道原理然后自己尝试的。因为查阅速度快,难免可能会漏掉一些更好的方法,欢迎补充

 

 

posted on 2014-01-08 10:49  saviour.  阅读(681)  评论(0)    收藏  举报

导航