2017-02-27 88 views
0

我有C++和Java背景。我在使用JavaScript調用函數調用時遇到了一些麻煩。JavaScript範圍和函數調用

以下是我的代碼示例,我聲明變量lon和lat#4。並在#5和#6行上賦值。

這是我的問題,我打電話給#1上的writeToTes(),它工作。但是,當我在#2或#3上放置writeToTes()時,lon和lat是空的,就像它從未分配過的一樣。這是爲什麼?

根據我的邏輯,我們已經執行,如果(navigator.geolocation){},lat和lon應該已經分配,​​爲什麼當我調用writeToTes()lon並且lat仍然是空的。

var lon = '', 
 
    lat = ''; // #4 
 

 
$(document).ready(function() { 
 
    setLonLat(); 
 
}); 
 

 
function setLonLat() { 
 
    if (navigator.geolocation) { 
 
    navigator.geolocation.getCurrentPosition(function(position) { 
 
     lat = (position.coords.latitude); //#5 
 
     lon = (position.coords.longitude); //#6 
 
     writeToTes(); //#place it Here #1 
 
    }); 
 
    //#place it Here #2 
 
    } 
 
    //#place it Here #3 
 
} 
 

 
function writeToTes() { 
 
    $("#tes").html(lon + " " + lat); 
 
}

+2

這是因爲異步性,這就是爲什麼你傳遞迴調函數 - 當收到結果時調用它。如果將變量放置在回調處理程序之外,您會在分配東西之前看到它處於狀態 – baao

回答

6

這是因爲getCurrentPosition()是一個異步操作。您傳遞給getCurrentPosition()的函數稱爲回調函數。放入此函數的任何代碼在獲取當前位置後執行。

當您在撥打getCurrentPosition()後放置writeToTest()時,它在getCurrentPosition()執行完畢之前執行。因此,latlon尚未分配到。

+0

有沒有辦法保留在回調函數中分配的變量,並仍然能夠訪問回調函數以外的變量? –

+0

您仍然可以在回調函數外訪問它,但這不是一件好事,因爲您不知道它何時被分配。因此,您希望根據回調中的位置執行所有代碼。如果你想使這個代碼更整潔,使用Promises。 –

+0

@Hadaz Zeilberger謝謝! –

0

這就像添加一個按鈕點擊eventhandler。一旦按鈕被點擊,eventhandler只會觸發。在這種情況下,當您獲取地理位置時,將調用您的eventhandlercallback。您回調的位置包含您的latlon數據。