在以下代码中,先检查执行并将this.canClick设置为false。然后resetClick在this.clickDelay秒后将this.canClick设置为true。但是,再次调用检查时未看到更改。我在两个函数中记录了this.canClick的值:resetClick logs true,然后检查同一变量的日志false。
this.resetClick=function(){
this.canClick=true;
};
this.check=function(){
if (isMouseDown&&this.canClick==true){
if (mouse.x>=this.x-this.sizex/2 && mouse.x<=this.x+this.sizex/2 && mouse.y>=this.y-this.sizey/2 && mouse.y<=this.y+this.sizex/2){
this.text=this.callback();
this.canClick=false;
setTimeout(this.resetClick, this.clickDelay);
}
}
};
我不相信这是一个范围问题,因为它们都是同一个对象的成员函数,并且正在修改该对象的属性。此外,如果您想知道,这是一个检查按钮是否被点击的功能,并且&#34; debouncing&#34;所以你不要错误地点击同一个按钮两次。 编辑:重要的缺失信息:如果我只是调用resetClick,而不使用setTimeout,它可以工作。
答案 0 :(得分:1)
使用setTimeout
调用的方法在对象范围之外运行,因此this
仅在执行方法时引用全局窗口对象(这意味着{{1实际上将是this.canClick
。
使用闭包来保留对象内window.canClick
的值。
答案 1 :(得分:1)
这确实是一个范围问题。
函数内部的this
不会引用稍后将包含该函数的对象。
你应该通过这个简单的技巧(tm)绕过它:使用this
的别名
var that = this;
this.resetClick=function(){
that.canClick=true;
};
this.check=function(){
if (isMouseDown&&that.canClick==true){
if (mouse.x>=that.x-that.sizex/2 && mouse.x<=that.x+that.sizex/2 && mouse.y>=that.y-that.sizey/2 && mouse.y<=that.y+that.sizex/2){
that.text=that.callback();
that.canClick=false;
setTimeout(that.resetClick, that.clickDelay);
}
}
};