无法从函数更新全局变量

时间:2017-12-11 19:47:37

标签: javascript

我想更新我的全局变量,这些变量旨在保存我的坐标值。它们的值仅在函数内部,而不在外部(全局)。说实话,这让我发疯了。如果我想使用它们的值,我必须在函数中调用函数...这对我来说没有意义(我更喜欢单独调用函数)。以下是我的代码:

var lat = '';
var lon = '';
navigator.geolocation.getCurrentPosition(succes, error);

function succes(position){
    var crd = position.coords;
    lat = crd.latitude;
    console.log('inside: '+lat);

}

function error(err){
    console.warn(err.code + ': ' + err.message);
}

console.log('outside: '+lat);

知道为什么会这样吗?

编辑:我现在意识到,执行的顺序并不像我想要的那样。为什么呢?

2 个答案:

答案 0 :(得分:0)

问题是navigator.geolocation.getCurrentPosition(succes, error)是异步的。它不会在最终console.log()之前被调用,因为它出现在该语句之前的代码中。最终的console.log()会在success函数返回之前运行,此时lat尚未分配其值。

你可以做你正在尝试的事情,你只需要等到success完成:



var lat = '';
var lon = '';
navigator.geolocation.getCurrentPosition(succes, error);

function succes(position){
    var crd = position.coords;
    lat = crd.latitude;
    lon = crd.longitude;
    
    // At this point, we know that the global variables have been 
    // assigned their values, so it's safe to access them:
    successIsDone();
}

function error(err){
    console.warn(err.code + ': ' + err.message);
}

function successIsDone(){
  console.log('latitude: '+ lat);
  console.log('longitude: '+ lon);  
}




答案 1 :(得分:0)

navigator.geolocation.getCurrentPosition很可能是异步的,对吗?这意味着console.log('outside: '+lat);在为lat分配值之前执行。您必须在成功之后(或内部)使用您的变量:

var lat = '';
var lon = '';
navigator.geolocation.getCurrentPosition(succes, error);

function succes(position){
    var crd = position.coords;
    lat = crd.latitude;
    console.log('inside: '+lat);
    doSomethingWithMyVariables();
}

function error(err){
    console.warn(err.code + ': ' + err.message);
}

function doSomethingWithMyVariables(){
    console.log('outside: '+lat);
}