2010-06-03 173 views
2

這是一個簡單的問題,但我無法解決。javascript中的變量範圍

細節並不重要,但這是要點。我有一些像這樣的代碼:

var lat = 0; 
var lon = 0; 

if (navigator.geolocation) {  
    navigator.geolocation.getCurrentPosition(function(position) { 
     lat = position.coords.latitude; 
     lon = position.coords.longitude; 
    }); 
} 

我覺得它做的是:

  1. 設置緯度和經度,以0
  2. 如果瀏覽器地理位置,覆蓋這些變量與實際值

但是,在該塊的末尾,lat和lon仍然是0.我試過加入var s,將lat和lon傳遞給函數等,但沒有成功...

我該如何做這項工作?

+0

啊,答案很有意義。我知道這是異步的,但我不習慣用那種風格進行編程。那麼我如何專門做這項工作呢?在這個塊之後,我使用ajax來訪問一個API,並且不想重複這個代碼兩次,這取決於我們是否知道位置。 – 2010-06-03 12:19:25

+0

將呼叫置於其他API *內*從'getCurrentPosition'回調 – Pointy 2010-06-03 12:38:34

回答

6

這是一個異步回調。基本上,您將一個函數傳遞給導航器API。然後,你的代碼繼續(並做任何事情)。稍後,導航器API會用答案(位置)調用您的回調。因此,任何使用頭寸的內容必須位於回調內(包括調用)。

另請參閱this previous answer,它顯示瞭如何創建和使用包裝函數。

編輯:你可以簡單地寫一個函數,無論你調用你的回調。如果你願意,getLocation可以傳遞另一個標誌給它的參數(例如失敗/成功代碼)。

function getLocation(callback) 
{ 
    if (navigator.geolocation) {  
     navigator.geolocation.getCurrentPosition(callback); 
    } 
    else { 
     callback(null); 
    } 
} 

再後來:

getLocation(function(pos) 
{ 
    //do stuff 
    if(pos != null) 
    { 
    // loc stuff 
    } 
    // more stuff 
}); 

您不必使用匿名函數。

2

這與範圍無關。 getCurrentPosition是異步調用的,這意味着它將在收到位置之前立即返回。僅當實際收到地理位置時才調用function(position)

1

getCurrentPosition()是異步的 - 值不會立即更新。

getCurrentPosition()方法需要一個,兩個或三個參數。被調用時,它必須立即返回,然後異步地嘗試獲取設備的當前位置。如果嘗試成功,必須用新的Position對象調用successCallback(即必須在回調對象上調用handleEvent操作),以反映設備的當前位置。如果嘗試失敗,則必須使用新的PositionError對象調用errorCallback,以反映失敗的原因。

alert函數的值,你會看到變化。編寫代碼以在函數內執行任何您想要的操作(或將它們抽象爲另一個函數並從那裏調用它),而不是在if塊之後繼續。爲了安全起見,請添加錯誤回調。