我有以下无法同时运行的功能:
function foo()
{
if(this.running) return;
this.running = true;
setTimeout(function() {
// Do Something
delete this.running;
}, 5000);
}
以上似乎有效,但当我在匿名函数中检查this
的值时,它指向Window
。我不确定这是否是正确或正确的删除属性的方法。任何人都可以建议为什么这有效吗?
答案 0 :(得分:2)
是的,这是正确的,因为调用setTimepout中提供的匿名函数的对象是window对象,要保存一个值为this的闭包变量,只需执行以下操作:
function foo()
{
if(this.running) return;
this.running = true;
var self=this;
setTimeout(function() {
// Do Something
delete self.running;
}, 5000);
}
<强>更新强>
当你运行从X对象执行的foo函数(这样有X)时,它会按顺序调用函数的内容,直到它运行setTimeout函数,此函数在睡眠队列下添加匿名函数,执行将继续执行带有X对象的foo函数,
当睡眠队列中的每个元素都超过其超时时间时,它将在窗口对象下为所有这些元素调用。