addEventListener对象的方法

时间:2014-08-24 19:14:03

标签: javascript cordova memory-leaks encapsulation addeventlistener

我有一个多“页面”的phonegap应用程序,我正在尝试正确编写代码,因此我将整个页面2代码封装在如下对象中。但我观察到,如果我将populateDBerrorCBsuccessCB函数作为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 个答案:

答案 0 :(得分:0)

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

我不确定你要做什么,不过我相信你的问题来自使用"这个"。

您使用Page2_Obj作为构造函数吗? (即创建例如:

var pagex = new Page2_obj();

? 如果没有,你将所有这些内部方法绑定到GLOBAL对象,这是个坏主意。我也怀疑这是你想要做的。

你能解释一下你想要实现的目标吗?如果是封装,那么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;
      };
    }());