2015-06-07 179 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