未捕获的TypeError:无法调用未定义的方法'XXX'

时间:2011-12-18 00:52:21

标签: javascript database oop

我在第一次尝试时给了JavaScript OOP一个漩涡,我收到了这个错误:

  

未捕获的TypeError:无法调用未定义的方法'addWeight'

正在抱怨weight.webdb.addWeight下的方法是从全局函数addWeight调用的。

var weight = {};
weight.webdb = {};
weight.webdb.db = null;

weight.webdb.addWeight = function() {
    var db = weight.webdb.db;
    db.transaction(function(tx) {
        var addedOn = new Date();
        tx.executeSql('INSERT INTO weight(input,comment,date) VALUES (?,?,?)', [inputWeight, inputComment, addedOn], weight.webdb.onSuccess, weight.webdb.onError);
    });
};

function addWeight(){
    var weight = document.getElementById('inputWeight');
    var comment = document.getElementById('inputComment');  
    weight.webdb.addWeight(weight.value,comment.value); 
}

演示:http://jsfiddle.net/SMbL3/1/

3 个答案:

答案 0 :(得分:1)

由于错误明确指出,weight.webdb不存在 weight是本地DOM元素,而不是全局变量。

答案 1 :(得分:1)

函数中定义的局部变量weight正在遮蔽外部作用域中的weight变量。只需调用function-local变量,就像weight_elem

一样
function addWeight() {
    var weight_elem = document.getElementById('inputWeight');
    var comment_elem = document.getElementById('inputComment');  
    weight.webdb.addWeight(weight_elem.value, comment_elem.value); 
}

答案 2 :(得分:0)

var weight = document.getElementById('inputWeight');
var comment = document.getElementById('inputComment');  
weight.webdb.addWeight(weight.value,comment.value);
//^^^^                 ^^^^^^
//  1                     2

您期望(1)引用您在其他地方定义的全局变量weight,以及(2)引用局部变量weight。我希望你看看这是如何导致问题的。

实际上,总是假设局部变量而不是全局变量。解决方案:使用不同的名称。