在另一个函数中看不到函数中的修改值

时间:2014-06-09 00:53:06

标签: javascript scope settimeout

在以下代码中,先检查执行并将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,它可以工作。

2 个答案:

答案 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);
        }
    }
};