Javascript 返回';未定义';函数中的变量

Javascript 返回';未定义';函数中的变量,javascript,html,sqlite,Javascript,Html,Sqlite,我是javascript新手,无法找到解决方案。 我读过一些类似的问题,但看起来问题与我的不一样 我使用以下代码从script1调用一个方法: function turnPage(){ var current = window.now; var nextpage = getNextPage(current); alert(nextpage); } 在script2中有一个SQLite等: function getNextPage(Pid) { db.trans

我是javascript新手,无法找到解决方案。 我读过一些类似的问题,但看起来问题与我的不一样

我使用以下代码从script1调用一个方法:

 function turnPage(){
    var current = window.now;
    var nextpage = getNextPage(current);
    alert(nextpage);
}
在script2中有一个SQLite等:

function getNextPage(Pid) {
    db.transaction(function(tx) {
        tx.executeSql('SELECT * FROM Page WHERE Pid=' + Pid, [],
                    function(tx, results) {
            nextp = parseInt(results.rows.item(0).NextPage);
            //alert(nextp);
            return nextp;   
        }, errorCB);
    }, errorCBQuery);
}
如果在被调用函数中使用警报对话框,则变量nextp为2。 但如果我返回变量,它将作为“未定义”发出警报。 另外,如果我etc使变量var nextp=11;通过“db.transaction…”和函数末尾的return语句,它将返回11而不是2

这是因为在我的函数开始时变量没有发送到内部函数吗?:)


你知道怎么做吗?谢谢

您的外部函数在任何时候都不会实际返回
nextp

对于(我认为)你将要做的事情,有两种解决方案

  • 创建一个全局变量并将
    nextp的值存储在那里
  • 引入另一个回调以使用
    nextp
    的值,例如,创建新链接或其他内容。如果需要,可以将代码放在另一个函数中,并将其作为参数传递到
    getNextPage()
    或将代码直接放在最内部的函数中(在
    警报
    调用的位置)
  • 请注意,回调用于处理许多JavaScript API的异步特性。因此,当
    getNextPage()
    完成时,即使您的
    getNextPage()
    也无法返回内部查询的值,因为该值不存在


    无论如何,可以删除最内部函数中的
    return
    语句,因为没有函数实际接收该值。

    我不知道javascript中的SQLite是如何工作的,但我怀疑它是异步工作的,因此,您在
    turnPage
    中调用
    alert
    ,但事务正在异步运行,返回值仍在另一个范围内。您可以尝试将回调函数传递给
    getNextPage
    ,然后使用
    nextp
    作为参数调用回调,而不是返回
    nextp

    function turnPage(){
        var current = window.now;
        getNextPage(current, function (nextp) { alert(nextp); /* do whatever else you need to do */ });
    }
    
    
    
    function getNextPage(Pid, cb) {
        db.transaction(function(tx) {
            tx.executeSql('SELECT * FROM Page WHERE Pid=' + Pid, [],
                        function(tx, results) {
                nextp = parseInt(results.rows.item(0).NextPage);
                cb(nextp);   
            }, errorCB);
        }, errorCBQuery);
    }
    

    现在,您的代码有几个问题

  • 由于JavaScript主要是异步的,因此您的代码:

    nextpage = getNextPage(current);
    alert(nextpage);
    
    将调用
    getNextPage()
    ,但它不会等待响应后再继续,因此警报将立即触发,此时,如果响应尚未返回和分配(很可能是这种情况),则
    nextpage
    将未定义

  • 第二个问题是外部函数不返回任何内容。您从内部函数返回值,但在外部函数中“它被卡住了”。一种解决方案是将值赋给全局变量,而不是从函数返回。您仍然需要注意“异步问题”,以便在赋值之前不读取全局变量


  • 丹,成功了!(如果有人使用此代码,则提示中有输入错误,应该是提示(nextp),而不是提示(nextpage)@user1255456记住,如果解决了您的问题,请接受答案。