如何清除这个闭包引用

时间:2012-11-07 15:38:59

标签: javascript

对于此代码:

    var myObj = {
    callMeMaybe: function () {
        var myRef = this;
        var val = setTimeout(function () { 
            console.log('Time is running out!'); 
            myRef.callMeMaybe();
        }, 1000);
    }
};

myObj.callMeMaybe();
myObj = null;

如果我们调用myObj.callMeMaybe()然后调用myObj = null。 我们仍然无法取消对callMeMaybe()的调用;无论如何要解决这个问题?感谢。

3 个答案:

答案 0 :(得分:0)

您需要window.clearTimeout上的val

    var myObj = {
    callMeMaybe: function () {
        var myRef = this;
        this.val = setTimeout(function () { // made val visible outside
            console.log('Time is running out!'); 
            myRef.callMeMaybe();
        }, 1000);
    }
};

myObj.callMeMaybe();

window.clearTimeout( myObj.val );
myObj = null;

答案 1 :(得分:0)

clearTimeout()方法清除使用setTimeout()方法设置的计时器。 setTimeout()返回的ID值用作clearTimeout()方法的参数。

clearTimeout(id_of_settimeout);

Number.MAX_VALUE 为1.7976931348623157e + 308VALUE

我认为这个问题可以通过clearTimeout循环1.7976931348623157e + 308VALUE次来完成。

需要很长时间吗?

或者你可以通过

获得max id_of_settimeout
max_id_of_settimeout = setTimeout(null,0);

然后循环回

for (var i = max_id_of_settimeout;i>=0;i--){clearTimeout(i);}

只是我的意见。

答案 2 :(得分:-1)

使用新函数覆盖callMeMaybe属性,如果不介意TypeError,则覆盖null

myObj.callMeMaybe();
myObj.callMeMaybe = function(){};

现在,当从setTimeout进行异步调用时,它将调用空函数。


如果您不想覆盖该功能,则只需在对象上设置一个标志。

var myObj = {
    callMeMaybe: function () {
        var myRef = this;
        var val = setTimeout(function () { 
            console.log('Time is running out!'); 
            if (!myRef.prevent)
                myRef.callMeMaybe();
        }, 1000);
    }
};

myObj.callMeMaybe();
myObj.prevent = true; // will prevent the .callMeMaybe() in the setTimeout

但要明确,你无法清除闭包引用本身。对象是引用类型,JavaScript是按值传递的。

这意味着当你这样做时:

var myRef = this;

...你已经制作了对象参考的副本。因为myRef是局部变量,所以无法从外部触及。您可以做的最好的事情是操纵引用的对象,或使myRef变量可用于外部范围。

......并且忽视了选民。他们不了解JavaScript的工作原理。