更改全局变量值在javascript中不起作用

更改全局变量值在javascript中不起作用,javascript,cordova,Javascript,Cordova,我在javascript中更改全局变量的值时遇到了问题…下面是完整的代码 //Initialize cordoba document.addEventListener("deviceready", onDeviceReady, false); function onDeviceReady(){ var undefined; var phone_number; //change phone_number checkData(); //alert the

我在javascript中更改全局变量的值时遇到了问题…下面是完整的代码

//Initialize cordoba
document.addEventListener("deviceready", onDeviceReady, false);

function onDeviceReady(){
    var undefined;
    var phone_number;

    //change phone_number
    checkData();

    //alert the new phone_number
    alert(phone_number);


    function checkData(){
        var db = window.openDatabase("Demo", "1.0", "Demo", 512000);
        db.transaction(selectProfile,DBerror);
    }

    function selectProfile(db){
        db.executeSql('SELECT phone_number FROM profile', [],
            function(db,results){
                if(results.rows.length > 0){
                    //change the global variable(phone_number)
                    phone_number = results.rows.item(0).phone_number;
                }else{location.href = 'index.html';}
            },
            DBerror
        );
    }
}
在每个页面中,我需要从数据库中获取phone number值,将全局变量(phone_number)更改为该值,并在整个脚本中使用它。
谢谢

声明
电话号码
任何功能之外的功能都应该工作


您还可以使用
window.phone\u number
来保证全局范围。但这被认为是不好的做法?我相信有人比我更有经验来解释原因。

声明
电话号码
在任何功能之外都应该工作


您还可以使用
window.phone\u number
来保证全局范围。但这被认为是不好的做法?我相信有人比我更有经验来解释原因。

这一条放在一边,用于检查变量是否存在,您必须为旧浏览器定义它。为什么您不简单地使用返回电话号码的
getPhoneNumber()
函数?然后你可以说
var phone_number=getPhoneNumber()
由于phonegap api的工作原理,它无法实现(或者我想不出一个实现的方法),它是用来检查变量是否存在的,你必须定义它,因为旧浏览器的原因,为什么你不能简单地使用一个返回电话号码的
getPhoneNumber()
函数?然后你可以说
var phone_number=getPhoneNumber()
由于phonegap api的工作方式
窗口,它无法实现(或者我想不出一种实现方法)。phone_number
只是一种不好的做法,因为全局变量通常是不好的做法。使用
窗口
的唯一一个特别的缺点是,您的代码将稍微难以移植到node.js,它使用
全局
而不是
窗口
作为其全局。@Spikes您需要在任何变量之外定义
电话号码
,而不是在任何其他地方定义它。如果您只是在脚本顶部添加了一个
var phone\u number
,但没有在
ondevicerady
中删除
var phone\u number
,则内部声明将“隐藏”外部声明,因此设置
phone\u number
将设置局部变量,而不是全局变量。@Spikes,而我的上述注释为true,我只是更仔细地阅读了你的代码,发现你犯了一个典型的异步错误,这也会导致你的代码失败。
db.executeSql
中的回调只有在
警报运行之后才会运行。@apsillers;一定是这样。我在W3C上搜索了一个解决方案,但没有找到。你能用一种有效的方式重写代码吗。我需要在页面发生任何事情之前从数据库中获取数据。谢谢lot@apsillers; 我已经重写了代码。谢谢你的建议,它真的很有帮助。
window.phone\u number
只是一种不好的做法,因为全局变量通常是不好的做法。使用
窗口
的唯一一个特别的缺点是,您的代码将稍微难以移植到node.js,它使用
全局
而不是
窗口
作为其全局。@Spikes您需要在任何变量之外定义
电话号码
,而不是在任何其他地方定义它。如果您只是在脚本顶部添加了一个
var phone\u number
,但没有在
ondevicerady
中删除
var phone\u number
,则内部声明将“隐藏”外部声明,因此设置
phone\u number
将设置局部变量,而不是全局变量。@Spikes,而我的上述注释为true,我只是更仔细地阅读了你的代码,发现你犯了一个典型的异步错误,这也会导致你的代码失败。
db.executeSql
中的回调只有在
警报运行之后才会运行。@apsillers;一定是这样。我在W3C上搜索了一个解决方案,但没有找到。你能用一种有效的方式重写代码吗。我需要在页面发生任何事情之前从数据库中获取数据。谢谢lot@apsillers; 我已经重写了代码。谢谢你的建议,真的很有帮助。