2015-09-12 56 views
0

我使用谷歌地圖API和我注意到一個綱領性的行爲,我不熟悉JavaScript中:地理位置功能參數行爲

function success(pos) { 
    // ...do something with pos. 
} 

navigator.geolocation.getCurrentPosition(success); 

在上面的例子看起來好像成功函數從稀薄空氣中傳遞'pos'參數,並且成功函數不會通過括號在getCurrentPosition參數內部調用。我期望看到這樣的事情:

function success(pos) { 
    //...do something with pos. 
} 

var pos = //...something; 
navigator.geolocation.getCurrentPosition(success(pos)); 

我只是不明白這裏發生了什麼。爭論從何而來?爲什麼甚至不用括號來調用函數?

回答

1

這是一個功能,您將在Javascript中經常看到。它通常被稱爲回調。括號的缺乏是因爲Javascript允許你像一個變量那樣對待一個函數,通常被稱爲「一等函數」。您正在將success函數傳遞給getCurrentPosition方法,但實際上並沒有調用success方法。

當您致電navigator.geolocation.getCurrentPosition(success);時,您對getCurrentPosition函數說,找到該位置後,您希望它調用您提供的函數並將其傳遞給它的位置。

getCurrentPosition方法會做類似如下:

function getCurrentPosition(successCallback) { 
    var position = loadFromSomewhereThatMayTakeAWhile(); 
    successCallback(position); 
} 

getCurrentPosition可能需要很多秒鐘甚至幾分鐘來獲取當前位置。您不希望瀏覽器在發生這種情況時停止響應。回調允許你說「當這個操作完成時,調用這個其他方法來做結果的事情」。然後,瀏覽器可以繼續執行其他操作,並且只在操作完成時才執行回調。

jQuery ajax功能使用此回調風格。

var whenSuccessful = function(data, status, xhr){ 
    console.log('The data was loaded successfully.') 
}; 

var whenFailed = function(xhr, status, error){ 
    console.log('The request failed!') 
}; 

$.ajax({ 
    url: "http://myserver.com/some_data.json", 
    error: whenFailed, // do this if the request fails for any reason 
    success: whenSuccessful // do this if the data was loaded successfully 
}) 
+0

謝謝,澄清我的問題。 – Katgus