1

对于此代码:

    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() 的调用;无论如何要解决这个问题?谢谢。

4

3 回答 3

0

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

clearTimeout(id_of_settimeout);

Number.MAX_VALUE是 1.7976931348623157e+ 308VALUE

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

需要很长时间吗?

或者您可以通过以下方式获得最大 id_of_settimeout

max_id_of_settimeout = setTimeout(null,0);

然后循环回

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

只是我的观点。

于 2012-11-07T15:56:11.187 回答
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;
于 2012-11-07T15:42:34.017 回答
-1

使用新函数覆盖callMeMaybe属性,或者null如果您不介意 TypeError。

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 的工作原理。

于 2012-11-07T15:42:27.150 回答