2015-06-07 123 views
0

我已经获得了这部分代码,其中变量纬度和经度声明在范围之外,然后在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

该代码似乎是正确的 - 验证positonSuccess事先被调用。 –

+2

@ConnorPeet - 'positionSuccess'是异步的,因此在'$(document).ready()'回调函数完成执行后调用。这就是导致问题的原因 - 请参阅下面的答案。 – jfriend00

回答

5

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

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

需要的positionSuccess()内部结果的任何代码都必须放置在回调函数里面,或者你可以调用一些其他的功能,并将结果传递变量STO它。

$(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 

)}; 
+0

哇,真棒答案 - 它绝对清除了我。非常感谢! – hidace