在侦听器函数内调用方法时引用错误(Javascript)

时间:2012-06-12 17:50:43

标签: javascript oop scope

function LolClass(){

    this.init = function(){             
        button_a.bind("tap", function(){                
            this.refreshFields(); // doesn't work 
            //refreshFields(); // doesn't work either
        });     
    }

    this.refreshFields = function(){
        alert("LOL");
    }

    this.dummy = function(){
        this.refreshFields(); // W O R K S!
    }
}

当我点击button_a时,我收到一个引用错误,因为没有“找到”refreshFields方法。

  

未捕获的ReferenceError:未定义refreshFields   文件:///android_asset/www/src/pages/main.js:70

但是如果我在其他地方调用该方法而不是那个tap侦听器,那就可以了。

我完全确定点击侦听器功能中的this正在引用事件目标button_a。

我的问题是:最好的(oo)修复是什么?

3 个答案:

答案 0 :(得分:8)

试试这个

function LolClass(){

    var someVar = 0; 
    var self = this;

    this.init = function(){             
        button_a.bind("tap", function(){                
            self.refreshFields(); // now works!
            //refreshFields(); // doesn't work
        });     
    }

    this.refreshFields = function(){
        alert("LOL");
    }

    this.dummy = function(){
        this.refreshFields(); // W O R K S!
    }
}

答案 1 :(得分:4)

您应该缓存this

var that = this; // "that" is a convention name for "this"
this.init = function(){             
        button_a.bind("tap", function(){                
            that.refreshFields(); 
        });     
    }

答案 2 :(得分:4)

您需要修改代码:

function LolClass(){

    var someVar = 0; 
    var $this = this;

    this.init = function(){             
        button_a.bind("tap", function(){                
            $this.refreshFields();
        });     
    }

    this.refreshFields = function(){
        alert("LOL");
    }

    this.dummy = function(){
        this.refreshFields(); // W O R K S!
    }
}
内部回调中的“this”指的是不同的对象。我添加了var $ this = this;并在回调中使用$ this。