Javascript 对象方法上的addEventListener

Javascript 对象方法上的addEventListener,javascript,cordova,memory-leaks,encapsulation,addeventlistener,Javascript,Cordova,Memory Leaks,Encapsulation,Addeventlistener,我有一个多页面的phonegap应用程序,我正在尝试正确地编写代码,所以我将整个第2页代码封装在一个对象中,如下所示。但我注意到,如果我将populated b、errorCB和successCB函数作为page2_Obj的方法,则saveData无法找到它们。如果我把这些函数作为saveData本身的成员,一切都正常。所以我的问题是: 1.为什么saveData看不到它的同级? 2.将这些函数作为saveData的成员是正确的还是有更好的方法 3.我是否将这些函数作为saveData的成员而泄

我有一个多页面的phonegap应用程序,我正在尝试正确地编写代码,所以我将整个第2页代码封装在一个对象中,如下所示。但我注意到,如果我将
populated b
errorCB
successCB
函数作为
page2_Obj
的方法,则saveData无法找到它们。如果我把这些函数作为saveData本身的成员,一切都正常。所以我的问题是:

1.为什么saveData看不到它的同级?
2.将这些函数作为saveData的成员是正确的还是有更好的方法 3.我是否将这些函数作为saveData的成员而泄漏内存

function page2_Obj() {
    this.bindEvents = function() {
        var obj = document.getElementById('savebtn');
        obj.addEventListener('click', this.saveData, false);

    this.unbindEvents = function() { /* blah */ }

    this.populateDB = function(tx) {
        /* blah */
    }

    this.errorCB = function(err) {
       alert("Error: "+err.code+ ' '+err.message);
    }

    this.successCB = function() {
       alert("success!");
    }

    this.saveData = function(){
        var db = window.openDatabase("Database", "1.0", "PhoneGap Demo", 200000);
        db.transaction(this.populateDB, this.errorCB, this.successCB);
    }
}

感谢您快速回答您的问题: 1.停止使用这个,将方法绑定到全局对象,这是个坏主意。 2.我认为你应该把模块模式作为一种更好的方式来看待(我的答案结束) 3.我不这么认为

我不知道你想做什么,尽管我相信你的问题来自于“this”的使用

您是否使用Page2_Obj作为构造函数?(即创建实例,例如:

var pagex = new Page2_obj();
?? 如果没有,你就把所有的内部方法都绑定到全局对象上,这是个坏主意。我也怀疑这是你想要做的

你能解释一下你想要实现什么吗?如果是封装,那么IIFE更适合:

   var Page2_obj = (function() {
      // some private data
      var a = 'private string';

      // create some private methods
      function imPrivate() {
       // do something
      }

      // reveal public API (methods)
      return {
        imPrivate: imPrivate;
      };
    }());

对每个函数使用
this.
的目的是什么?我用
this
声明函数,这样它们就变成了page2_Obj的方法,并试图用
this
在saveData中访问它们。您正在传递
save
方法,但它没有保留对最初引用它的
this
的引用。对吧,但是
saveData
不应该以某种方式访问它的同级吗?是的,作为构造函数,当我加载每个页面时,我运行一个函数,比如
window[id]=new window[controller]();window[id].bindEvents();
。通过封装,我试图防止全局对象混乱,因此如果两个页面有两个名为
errorCB
s的不同函数,则调用正确的函数。iLife在这方面有何帮助?