2015-09-12 7 views
0

Я использую Google Maps 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