2012-07-13 85 views
0

面向對象的,我有以下方法:的PhoneGap的localStorage和JS

DBConnection.prototype.successHandler = function(){ 
    console.log("DB_INFO: Schema created"); 
    for (k in this) console.log(k); 
    this.setStatus(DB_STATUS_OK); 
} 

我把這種在交易這樣的:

DBConnection.prototype.createSchema = function(){ 
    try { 
    this.c2db.transaction(
     function(tx){ 
     tx.executeSql('CREATE TABLE IF NOT EXISTS person(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL DEFAULT "");', 
     [], this.nullDataHandler, this.errorHandler); 
     tx.executeSql("INSERT INTO person(id, name) VALUES (NULL, 'miloud');", 
      [], this.nullDataHandler, this.errorHandler); 
     }, 
     this.errorHandler, 
     this.successHandler 
    ); 
    } catch(e){ 
    console.log("DB_ERROR: error during insert with message: " + e); 
    return; 
    } 
} 

的問題是,我得到:遺漏的類型錯誤:對象[對象窗口]沒有方法'setStatus'這清楚地表明我正在訪問的不是我在成功回調中使用的DBConnection實例。怎麼來的?這個回調裏面指的是什麼?有沒有辦法解決這個問題?

編輯

回調定義爲:

DBConnection.prototype.errorHandler = function(errorMsg){ 
    console.log("DB_ERROR: error creating schema with msg " + errorMsg.message); 
} 
DBConnection.prototype.successHandler = function(){ 
    console.log("DB_INFO: Schema created"); 
    for (k in this) console.log(k); 
    this.setStatus(DB_STATUS_OK); 
} 

而且setStatus方法

DBConnection.prototype.setStatus = function(str_status){ 
    localStorage.setItem(db_name, str_status); 
} 

謝謝!

回答

2

發生這種情況是因爲在javascript函數中的this引用的是在調用點符號之前的對象。但是,JavaScript中的函數是一流的值,可以在對象之外調用(或者對於完全不同的對象)。例如,如果obj是一個對象:

obj.myFunc = function() { console.log(this) }; 
obj.myFunc(); // <- Here this === obj 
var freeFunc = obj.myFunc; // The function is just a value, we can pass it around 
freeFunc(); // <- Now this === the top object (normally window) 
      // Still the same function, but *how* it was called matters 

你在做什麼是路過this.successHandler簡稱爲transaction通話功能,但功能並不知道你把它從對象什麼。當它被transaction調用時,它會在沒有對象的情況下執行,而this只會變爲window

爲了解決這個問題,你可以使用一個事實,即JavaScript有關閉和另一個匿名函數包裹功能:

DBConnection.prototype.createSchema = function(){ 
    try { 

    var that = this; 

    this.c2db.transaction(
     function(tx){ 
     tx.executeSql('CREATE TABLE IF NOT EXISTS person(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL DEFAULT "");', 
     [], this.nullDataHandler, this.errorHandler); 
     tx.executeSql("INSERT INTO person(id, name) VALUES (NULL, 'miloud');", 
      [], this.nullDataHandler, this.errorHandler); 
     }, 
     this.errorHandler, 
     function() { that.successHandler(); } 
    ); 
    } catch(e){ 
    console.log("DB_ERROR: error during insert with message: " + e); 
    return; 
    } 
} 

現在successHandlerthat被稱爲this,這是原來一樣this

這是一個關於this的常見誤解,但網上也有很多解釋,只是google「javascript this」。

+0

一句話,謝謝! – CoolStraw 2012-07-14 10:54:46