Прежде всего, передача функции в качестве параметра говорит о том, что вызываемая вами функция хотела бы, чтобы она вызывала эту функцию в будущем. Когда именно в будущем он будет вызван, зависит от характера того, что делает функция.
Если функция выполняет какие-то сетевые функции, а функция настроена на неблокирующую или асинхронную, то функция будет выполнена, сетевая операция будет запущена, и функция, которую вы вызвали, сразу же вернется, а остальная часть вашего встроенного JavaScript-код после того, как эта функция будет выполнена. Если вы вернете значение из этой функции, оно вернется сразу же, задолго до того, как функция, которую вы передали в качестве параметра, была вызвана (сетевая операция еще не завершена).
Между тем, работа в сети идет в фоновом режиме. Это отправка запроса, прослушивание ответа, а затем сбор ответа. Когда сетевой запрос завершен и ответ собран, ТО и только тогда исходная функция, которую вы вызвали, вызывает функцию, которую вы передали в качестве параметра. Это может произойти только через несколько миллисекунд или может занять несколько минут - в зависимости от того, сколько времени потребовалось для завершения сетевой операции.
Важно понимать, что в вашем примере вызов функции db.get()
давно завершен, и код последовательно после того, как он также выполнен. Не завершена внутренняя анонимная функция, которую вы передали в качестве параметра этой функции. Это сохраняется в закрытии функции javascript до тех пор, пока не завершится сетевая функция.
По моему мнению, многих людей смущает то, что анонимная функция объявляется внутри вашего вызова db.get и, по-видимому, является частью этого, и кажется, что, когда db.get()
будет сделано, это будет сделано тоже, но это не так. Возможно, это выглядело бы не так, если бы оно было представлено так:
function getCompletionfunction(result) {
// do something with the result of db.get
}
// asynchronous Javascript
db.get('select * from table1', getCompletionFunction);
Тогда, возможно, было бы более очевидно, что db.get немедленно вернется, и функция getCompletionFunction будет вызвана в будущем. Я не предлагаю вам писать так, а просто показываю эту форму как средство иллюстрации того, что действительно происходит.
Вот последовательность, которую стоит понять:
console.log("a");
db.get('select * from table1', function(result){
console.log("b");
});
console.log("c");
В консоли отладчика вы увидите следующее:
a
c
b
«а» происходит первым. Затем db.get () начинает свою работу, а затем сразу же возвращается. Таким образом, «с» происходит дальше. Затем, когда операция db.get () действительно завершится через некоторое время, произойдет «b».
Подробнее о том, как работает асинхронная обработка в браузере, см. Как JavaScript обрабатывает ответы AJAX в фоновом режиме?