Javascript 为什么我的全局变量没有定义?

Javascript 为什么我的全局变量没有定义?,javascript,Javascript,我是JavaScript新手。我不明白为什么它会在正确的id之前在控制台上打印未定义的值 VisaFam.dbs.addFamily = function(nom) { var db = VisaFam.dbs.db; var family_id; db.transaction(function(tx) { tx.executeSql("INSERT INTO family (nom) VALUES (?)", [nom],

我是JavaScript新手。我不明白为什么它会在正确的id之前在控制台上打印未定义的值

VisaFam.dbs.addFamily = function(nom) {
    var db = VisaFam.dbs.db;
    var  family_id;

    db.transaction(function(tx) {


        tx.executeSql("INSERT INTO family (nom) VALUES (?)",
            [nom],function(tx, results){
                family_id= results.insertId;     //i want to return this 
                console.log(results.insertId);   // this prints the correct value 

             });
     });


    console.log(family_id); // this shows undefined
     return family_id; // the return is thus "undefined"

     }
我试图返回插入的id,但返回时得到“未定义”,但控制台显示正确的id

VisaFam.dbs.addFamily = function(nom) {
    var db = VisaFam.dbs.db;
    var  family_id;

    db.transaction(function(tx) {


        tx.executeSql("INSERT INTO family (nom) VALUES (?)",
            [nom],function(tx, results){
                family_id= results.insertId;     //i want to return this 
                console.log(results.insertId);   // this prints the correct value 

             });
     });


    console.log(family_id); // this shows undefined
     return family_id; // the return is thus "undefined"

     }

我没有您程序的完整上下文,但似乎
db.transaction
函数是异步的。因此,
console.log()
语句在family\u id变量赋值之前运行

要测试这一点,您可以更改行
var family\u id
var系列\u id=“测试”
控制台应立即吐出“测试”


要记录所需的正确id,需要将
console.log()
调用移动到
db.transaction
函数中,以确保代码仅在设置值后执行。

I/O调用在js中异步发生,您应该从回调或承诺中获得返回值:

VisaFam.dbs.addFamily = function(nom, callback) {
    var db = VisaFam.dbs.db;
    var  family_id;

    db.transaction(function(tx) {
        tx.executeSql("INSERT INTO family (nom) VALUES (?)",
            [nom],function(tx, results){
                family_id= results.insertId;     //i want to return this 
                console.log(results.insertId);   // this prints the correct value 
                callback(results);
             });
        });
}
然后将addFamily称为:

addFamily(nom, function(response) {
    //handle response
})

I/O调用在JS中异步进行非常感谢Brandon,我现在明白了。