使用Javascript的变量作用域

使用Javascript的变量作用域,javascript,Javascript,我的印象是我的变量范围应该是正确的,但是没有设置值。我想知道为什么会这样 这是我的密码: function getUserStatus() { var status; function querySuccess(tx, results) { var row = results.rows.item(0); console.log(row['id']); status = { question: row['

我的印象是我的变量范围应该是正确的,但是没有设置值。我想知道为什么会这样

这是我的密码:

function getUserStatus() {


    var status;

    function querySuccess(tx, results) {
        var row = results.rows.item(0);
        console.log(row['id']);
        status = {
            question: row['id']
        };
    }

    function errorCB(err) {
        console.log(err);
    }

   db.transaction(function(tx) {
        tx.executeSql('SELECT id FROM calculator ORDER by id ASC LIMIT 1', [], querySuccess, errorCB);
    });

    console.log(status);
    return status;
}
现在,querySuccess()函数中的状态变量设置正确-我得到的值为1

然而,当我检查status的第二个变量时,在函数范围之外,我得到了未定义的变量


我是否误解了Javascript变量范围或错误地声明了变量?我是Javascript新手。

调用getUserStatus status时,其中的函数已定义但未执行,因此变量没有值(未定义),该值是尚未设置的变量的值。

在代码中,应使用中的参数调用函数querySuccess

db.transaction(function(tx) {
        tx.executeSql('SELECT id, women FROM calculator ORDER by id ASC LIMIT 1', [], querySuccess, errorCB);
    });
调用该函数时没有参数

参见此处:


您的代码是异步执行的,因此在查询成功之前,执行实际上返回了一个未定义的值。

我认为这不是javascript范围的问题。如何调用querySuccess()函数。您的代码中没有显示。我认为console.log(status);在调用querySuccess()之前正在工作。这就是为什么你没有定义。因为status没有任何初始值。您会被稍后调用的异步回调绊倒。因此,在调用异步回调之前以及在设置状态值之前,您正在执行
console.log(status)
。相反,您必须在回调本身中使用该值,或者从该回调调用函数并传递该值。当存在异步回调时,您不能像现在这样同步编程。有关Ajax调用的同一问题,请参阅本文,了解如何处理此问题的许多想法: