//这是错误的示范
function ChangeAndSet(slice) {
var line;
return function () {
if (line) {
clearInterval(line);
}
line= setInterval(Update, slice);
}
}
var obj=new ChangeAndSet(timeslice);
obj();//初始化执行
*************************
if(something){
obj(newtimeslice);//无法改变setInterval的间隔
}
在做项目的时候,发现如果需要改变setInterval的间隔(即slice的值),向如上代码所示往闭包的实例化对象obj内丢一个参数是不行。原因是obj.proto!=ChangeAndSet.prototype,实际上objproto == (匿名)function.prototype,所以obj(newtimeslice)其实是往闭包return的匿名function()内传递参数。
//正确的做法
function ChangeAndSet() {
var line;
return function (slice) {
if (line) {
clearInterval(line);
}
line= setInterval(Update, slice);
}
}
var obj=new ChangeAndSet();
obj(timeslice);//初始化执行
*************************
if(something){
obj(newtimeslice);//成功
}
正确的做法如上所示,将形参移动到匿名的返回函数中就可以了。由于obj是ChangeAndSet的一个活引用,在obj没有被销毁前,闭包在堆中的存放的值也不会被销毁。如果需要暂停Update函数,再传入另一个参数去判断就可以了,如下所示。
function ChangeAndSet() {
var line;
return function (slice, judge) {
if (line) { clearInterval(line); }
if (judge==0){ line= setInterval(Update, slice);}
else{ //不创建新的setInterval回调函数
}
}
var obj=new ChangeAndSet();
obj(timeslice);//初始化执行
*************************
if(stop){
obj(newtimeslice,1);//暂停
}
能够暂停的原因是当前执行setInterval回调函数已经被移出了event queue,而我们又没有创建新的setInterval,显然Update函数就不会再自动执行了。