向闭包内的参数传递新的值

在JavaScript项目中,遇到改变setInterval间隔的问题,发现直接向闭包实例对象传递参数无效,因为对象的原型不正确。解决方法是将参数移动到匿名返回函数中,确保闭包能正确捕获。通过这种方法,可以实现对setInterval间隔的动态调整,并在需要时暂停或恢复更新函数的执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//这是错误的示范
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函数就不会再自动执行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值