2013-01-07 25 views
1

我只是想從HTML5的geolocation.getCurrentPosition函數中獲取變量。但是,我在獲取變量之外的函數時遇到很多困難。Javascript函數變量範圍passthrough地理位置

功能的工作原理使用下面的代碼:

<script> 
var latitude; 
var longitude; 
var accuracy; 
var altitude; 
var altitudeAccuracy; 
var heading; 
var speed; 

if (navigator.geolocation){ 
    navigator.geolocation.getCurrentPosition( 
    function (position) { 
     latitude = position.coords.latitude; 
     longitude = position.coords.longitude; 
     alert(longitude) 
     accuracy = position.coords.accuracy; 
     altitudeAccuracy = position.coords.altitudeAccuracy; 
     heading = position.coords.heading; 
     speed = position.coords.speed; 
    } 
); 
} 

// alert(latitude); 

在這裏,我看到了alert(longitude)返回的數值。但是,當我評論該行,並取消註釋alert(latitude) - 我收到「未定義」警報。

任何幫助將不勝感激!謝謝。

回答

4

因爲getCurrentPosition是異步調用。

您需要等待回調才能訪問它檢索的值。

function nextStep(){ 
    alert(latitude); 
} 

navigator.geolocation.getCurrentPosition( 
    function (position) { 
     latitude = position.coords.latitude; 
     longitude = position.coords.longitude; 
     alert(longitude) 
     accuracy = position.coords.accuracy; 
     altitudeAccuracy = position.coords.altitudeAccuracy; 
     heading = position.coords.heading; 
     speed = position.coords.speed; 
     nextStep(); 
    } 
); 
1

getCurrentPosition是一個異步調用

在javascript中的併發有 「運行完成」 樣板工程。這意味着當前函數中的所有代碼在它移動到下一個執行上下文之前都會完成。在你的原代碼,該代碼將在這個順序執行:

  • 變量定義
  • getCurrentPosition初始化
  • 警報(緯度)
  • 腳本完成

,然後它會繼續前進到下一個執行上下文並運行回調函數,此時將設置變量並運行其他警報。如果您想確保首先設置變量,則需要在回叫中運行警報