对于此代码:
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()的调用;无论如何要解决这个问题?感谢。
答案 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_settimeoutmax_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的工作原理。