будет функционировать как ожидание обратного вызова и не завершится в сценарии 1?
Нет.В показанном вами коде нет ничего, что ожидало бы обратного вызова.
Передача обратного вызова функции аналогична передаче целого числа функции.Функция может использовать это или нет, но для интерпретатора это ничего не значит.Интерпретатор JS не имеет специальной логики для «ожидания переданного обратного вызова для вызова».Это никак не влияет на то, когда программа завершается.Это просто аргумент функции, которую вызываемая функция может решить, использовать ли ее или игнорировать.
В качестве другого примера, раньше было принято передавать два обратных вызова функции, один вызывался при успехе, а другой -был вызван по ошибке:
function someFunc(successFn, errorFn) {
// do some operation and then call either successFn or errorFn
}
В этом случае было совершенно ясно, что один из них будет вызван, а другой нет.Нет необходимости (с точки зрения интерпретатора JS) вызывать переданный обратный вызов.Это просто прерогатива логики вашего кода.
Теперь не рекомендуется создавать функцию, которая показывает обратный вызов в вызывающей сигнатуре, а затем никогда не вызывать этот обратный вызов.Это просто расточительный и вводящий в заблуждение дизайн.Есть много случаев обратных вызовов, которые иногда вызываются, а иногда и не зависят от обстоятельств.Array.prototype.forEach
является одним из таких примеров.Если вы вызываете array.forEach(fn)
для пустого массива, обратный вызов никогда не вызывается.Но, разумеется, если вы вызываете его в непустом массиве, он вызывается.
Если ваша функция выполняет асинхронные операции, а точка обратного вызова заключается в обмене данными, когда асинхронная операция выполняетсяготово и завершилось ли оно ошибкой или значением, тогда было бы неправильно иметь пути кода, которые никогда не вызывали бы обратный вызов, потому что для вызывающего абонента было бы естественно предположить, что обратный вызов в конечном итоге выполняет вызов.Я могу предположить, что могут быть некоторые исключения из этого, но их лучше действительно хорошо документировать с помощью документа / комментариев к функции.
Для асинхронных операций ваш вопрос напоминает мне кое-что из этого: Никогда не делайтеразрешенные обещания вызывают утечку памяти? , что может быть полезно для чтения.