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

Reference error when calling a method inside a listener function (Javascript)

本文关键字:方法 调用 引用 错误 侦听器 函数 Javascript      更新时间:2023-09-26
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时,我收到一个引用错误,因为"找不到"刷新字段方法。

未捕获的引用错误: 刷新字段未在 file:///android_asset/www/src/pages/main.js:70

但是,如果我在点击侦听器以外的其他地方调用该方法,它就可以工作。

我完全确定tap侦听器函数中的this引用的是button_a,即事件目标。

我的问题是:最好的(oo)解决方案是什么?

试试这个

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!
    }
}

你应该缓存this

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

您需要修改代码:

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。