Javascript匿名功能问题

时间:2010-12-15 21:02:50

标签: javascript anonymous-function

我有这个js类,它有一个匿名函数来检索一些查询结果。由于处理结果的函数是匿名的,我无法将结果保存在this.var变量中,并在其他地方使用它们,因为这在匿名函数中引用了window对象。我不能将它作为函数返回它返回,那么如何处理这些结果以使它们在其他地方可用?

someObject = {
    //  this.db is created, no need to paste that code
    dbGetAnimals: function () {
        this.db.readTransaction(function(tx) {
            tx.executeSql("SELECT * FROM animals", function(tx, results){
                return results;
            } )
        });
    },
    printAllAnimals: function () {
        var animals = this.dbGetAnimals();
        alert (animals);//  undefined
    }
}

someObject.printAllAnimals();

3 个答案:

答案 0 :(得分:3)

您可以创建一个本地变量来保存this引用。您的匿名函数将成为闭包,因此它将能够看到本地变量。

dbGetAnimals: function () {
    var myself = this;
    this.db.readTransaction(function(tx) {
        tx.executeSql("SELECT * FROM animals", function(tx, results){
            myself.var = results;
        } )
    });
},

答案 1 :(得分:2)

您正在尝试进行传统的同步/非阻塞编程,以便进行异步编程。

var someObject = function()({
    this.dbGetAnimals = function (callback) {
        db.readTransaction(function(tx) {
             tx.executeSql("SELECT * FROM animals", function(tx, results){
                 callback(results);
            } )
        });
    },

    this.printAllAnimals = function (callback) {
        this.dbGetAnimals(callback);
    }
})();

someObject.printAllAnimals(function(animals) {
    alert(animals);
}

有更简洁的方法可以做到这一点,但对于异步编程,你必须学会​​在回调上做所有事情而不是直接返回。

答案 2 :(得分:0)

这种情况正在发生,因为executeSql中的匿名函数是一个回调函数,在查询完成之前不会执行,根据定义,它将在dbGetAnimals返回之后执行。这就是你对dbGetAnimals的调用未定义的原因。

您必须传递一个回调函数才能从executSql回调中接收查询结果:

someObject = {  
    //  this.db is created, no need to paste that code  
    dbGetAnimals: function (callback) {  
        this.db.readTransaction(function(tx) {  
            tx.executeSql("SELECT * FROM animals", function(tx, results){  
                callback(results);
            } );
        });  
    },  
    printAllAnimals: function () {  
        this.dbGetAnimals(function(animals) {
            alert(animals)
        });  
    }  
}  


someObject.printAllAnimals();