Javascript jquery全局变量失败

Javascript jquery全局变量失败,javascript,jquery,Javascript,Jquery,我想在jquery函数之外使用一些变量,但我无法使它们成为全局变量。我按照建议先“var”它们,然后分配它们,但最后一个log()返回未定义 var lat,lon; $.get('ip.json',function(data) { var loc=data['loc']; lat=loc.split(',')[0]; lon=loc.split(',')[1]; },'json'); console.log(lat,lon); 更新这里是完整的代码 var l

我想在jquery函数之外使用一些变量,但我无法使它们成为全局变量。我按照建议先“var”它们,然后分配它们,但最后一个log()返回未定义

var lat,lon;
$.get('ip.json',function(data) {
    var loc=data['loc'];
    lat=loc.split(',')[0];
    lon=loc.split(',')[1];
    },'json');
console.log(lat,lon);
更新这里是完整的代码

var lat,lon;
$.get('ip.json',function(data) {
    console.log(data);
    var city=data['city'];
    var loc=data['loc'];
    lat=loc.split(',')[0];
    lon=loc.split(',')[1];
    $('body').append(' '+city+' '+lat+' '+lon);
    },'json');
console.log(lat,lon);
$.get('apiurl?lat='+lat+'&lon='+lon+'&callback=test',function(data) {},'json'),

问题是您正在发出一个异步调用,该调用在调用
console.log
后返回。您需要在回调中包含
console.log
,它才能正常工作

var lat,lon;
$.get('ip.json',function(data) {
    var loc=data['loc'];
    lat=loc.split(',')[0];
    lon=loc.split(',')[1];
    console.log(lat,lon);
    },'json');

除了上面这些人所说的,我相信您可以进行异步AJAx调用。看看这里

您可以使用ajax asyc调用

$.ajax({
    async: "false",
        type: "GET",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        url: "uri",
        success: function(data) {
            var loc=data['loc'];
            lat=loc.split(',')[0];
        lon=loc.split(',')[1];
        }
    });
console.log(lat,lon);

根据您的新代码,一个简单的解决方案是嵌套调用:

$.get('ip.json', function (data) {
    console.log(data);
    var city = data['city'];
    var loc = data['loc'];
    var lat = loc.split(',')[0];
    var lon = loc.split(',')[1];
    $('body').append(' ' + city + ' ' + lat + ' ' + lon);
    $.get('apiurl?lat=' + lat + '&lon=' + lon + '&callback=test', function (data) {
        //handle second response here
        console.log(lat, lon);
    }, 'json');
}, 'json');

给定更新的代码,您需要根据AJAX调用处理程序的结果挂起所有逻辑:

var lat, lon;
$.get('ip.json', function(data) {
    console.log(data);
    var city = data['city'];
    var loc = data['loc'];
    lat = loc.split(',')[0];
    lon = loc.split(',')[1];
    $('body').append(city + ' ' + lat + ' ' + lon);

    // at this point you now have the data for your second AJAX call:
    console.log(lat,lon);
    $.get('apiurl?lat=' + lat + '&lon=' + lon + '&callback=test', function(data){       
        // do something 
    },'json'),
},'json');

$.get()
是异步的。
console.log()
行在ajax回调函数之前执行。使用
$.ajax()
并使其与
async:false
@Brewal同步我以前说过,我要再说一遍,
async:false
永远不是答案。@Brewal您可以轻松地在回调中全局设置变量,但是,如果您正确地遵循异步模式,则不需要这样做。任何人最不应该做的事情就是乱扔全局变量。@DirkNachbar你能发布完整的JS代码吗。我不认为下面的答案不能解决您的问题。我需要在外部/全局/稍后而不是内部使用它。您将不得不回顾异步编程模型。您需要像上面那样利用回调,然后对调用进行适当的排序。您仍然可以分配全局变量,但您需要确保首先为变量分配值!不能使用此方法指定“以后”本身。但是,您可以设置另一个函数,在收到成功返回时触发console.log,但在处理异步请求时,脚本中的“晚”并不等于时间上的“晚”。如上所述,您可以使
$.get
同步,这将解决您的问题,但是你真的应该理解异步模型是如何工作的。为什么这个答案被否决了?没错,但不管你做什么。。。避免在同步模式下实际使用Ajax。这导致了黑暗面。学习使用异步操作。您可以/使AJAX调用同步,但请记住,这也将成为阻塞调用。。。在该调用返回之前,不会执行其他脚本,因此您将受远程服务器+延迟的支配,以确保您的脚本继续执行它需要执行的任何其他任务。我应该添加这一点,谢谢。我认为您指的是同步(synchronous),而不是异步(asynchronous),但是我强烈建议您不要使用Ajax同步模式,而是要学习使用异步操作。您不应该将
async
属性设置为
false
。学习使用回调和承诺对象。。。