全局变量在函数范围内未定义

时间:2015-06-07 23:00:06

标签: javascript

我已经得到了一些代码,其中变量纬度和经度被声明在positionSuccess函数之外,然后在positionSuccess函数内部定义。我想稍后重新使用这些变量,但它们会继续作为未定义返回。不知道为什么。

我认为如果它们是在函数之外定义的,那么它们应该在与其他函数相同的范围内可用。我在这里错过了什么吗?

$(document).ready(function(){

  navigator.geolocation.getCurrentPosition(positionSuccess, positionError);

  // Gets the user's location

  var latitude;
  var longitude;

  function positionSuccess(position){
    latitude = position.coords.latitude;
    longitude = position.coords.longitude;
  }

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

  // Other functions that need access to latitude and longitude variables.

)};

感谢您的帮助!

1 个答案:

答案 0 :(得分:5)

欢迎使用Javascript进行异步编程。因为代码不是在函数中从上到下顺序执行的,所以异步回调需要一种不同的编写代码的方法,它们接收的结果必须在回调中处理,而不是在回调之外。

positionSuccesspositionError是异步回调。在$(document).ready()处理程序执行完毕后,它们被称为long。因此,当您尝试使用latitudelongitude变量时,它们尚未设置。

任何需要positionSuccess()内部结果的代码都必须放在该回调函数中,或者您可以调用其他函数并将结果变量传递给它。

$(document).ready(function(){

  navigator.geolocation.getCurrentPosition(positionSuccess, positionError);

  function positionSuccess(position){
    var latitude = position.coords.latitude;
    var longitude = position.coords.longitude;

    // insert code to use the latitude and longitude variables here
  }

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

  // the latitude and longitude data is not yet available here because 
  // positionSuccess() is called in the future AFTER this part of 
  // the code executes

)};