javascript中的绑定和作用域

javascript中的绑定和作用域,javascript,scope,bind,Javascript,Scope,Bind,我必须承认,我还没有完全理解JS中的范围和绑定。所以请容忍我。 我想从函数q1得到结果r。但我无法在tx.executeSql调用中将其传递到匿名函数之外。 第一个console.log显示r包含所需的值。但是如何将其传递给调用函数呢? 该框架是mootools var q1 = function( table, column, where ) { sql = "SELECT " + column + " from " + table; r = ""; if (where

我必须承认,我还没有完全理解JS中的范围和绑定。所以请容忍我。 我想从函数q1得到结果r。但我无法在tx.executeSql调用中将其传递到匿名函数之外。 第一个console.log显示r包含所需的值。但是如何将其传递给调用函数呢? 该框架是mootools

var q1 = function( table, column, where ) {
    sql = "SELECT " + column + " from " + table;
    r = "";
    if (where != undefined)
        sql += " WHERE " + where;
    db.transaction( function(tx) {
        tx.executeSql( sql, [], function( tx, results) { 
            r = results.rows.item(0)[column] ;
            console.log(r + " 1 "); //1
            }, errorHandler );
    }); 
    console.log(r  + " 2 "); //2
    return r;
}

window.addEvent('domready', function() {
    db.transaction( function (tx) { 
        tx.executeSql( 'DROP TABLE IF EXISTS nutzer' );
        tx.executeSql( "CREATE TABLE IF NOT EXISTS nutzer ( "
            + " id integer not null primary key, "
            + " name text not null default '(unbekannt)', "
            + " jahre integer not null default 0, "
            + " gewicht integer not null default 0)"
        );
        var params = [1,'der Name',10,30];
        tx.executeSql( "INSERT OR IGNORE INTO nutzer (id,name,jahre,gewicht) values (?,?,?,?)", params);
    });
    console.log( q1('nutzer', 'name' ) + " 3 "); //3
})
控制台输出为:

2 
3 
der Name 1 

异步不是这样工作的。注意顺序,
2,3,1

var q1 = function( table, column, where, callback ) {
    //                                   ^ callbacks
    sql = "SELECT " + column + " from " + table;
    r = "";
    if (where != undefined)
        sql += " WHERE " + where;
    db.transaction( function(tx) {
        tx.executeSql( sql, [], function( tx, results) { 
            r = results.rows.item(0)[column] ;
            console.log(r + " 2 "); //2
            callback(r);
            // pass r back
            }, errorHandler );
    }); 
    console.log(r  + " 1 "); //1
    return r;
}

q1('nutzer', 'name', function (r) {
    console.log( r + " 3 "); // results!
}); 

欢迎来到异步的精彩世界!你需要使用回调。你不能返回它。您必须使函数接受回调,并将结果传递给回调。这是否意味着我不能使用同步函数从数据库读取值并返回它?