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上看到,而我也只是随便扫了一眼,大致知道原理然后自己尝试的。因为查阅速度快,难免可能会漏掉一些更好的方法,欢迎补充
浙公网安备 33010602011771号