Почему функция обратного вызова выполняется первой в javascript?

В приведенном ниже примере. имя — это функция обратного вызова внутри функции имя. При выполнении первым результатом будет Смит и Билли. Насколько я понимаю, функция обратного вызова имя должна выполняться после завершения выполнения функции fname. Почему я ошибаюсь здесь?

function fname(){ console.info("Billy");}
function lname(){ console.info("Smith");}
fname(lname());

Поскольку вы не передаете lname в качестве обратного вызова (функция в качестве аргумента), вы фактически передаете результат lname в качестве аргумента...

IronGeek 19.03.2019 04:09
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
924
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Аргументы функции оцениваются до ее вызова. Таким образом, fname(lname()) приводит к вызову lname, за которым следует fname. Результат lname передается fname в качестве первого аргумента, но не используется вызываемой функцией.

Ответ принят как подходящий

In the below example. lname is callback function inside fname function.

Нет это не так. Вы призываяlname (потому что вы добавили круглые скобки) и передаете результат своего вызова (который оказывается undefined, как в случае любого случая, когда функция явно не return значение) в fname. Как и Math.floor(Math.sqrt(10)) — здесь нет обратных вызовов. Между fname(lname()) и fname(lname) есть большая разница: последний передает саму функцию в другую функцию; и мы назовем это «обратным вызовом», если он действительно вызывается.

As per my understanding, callback function lname should be executed once fname function is finished executing.

Опять же, нет. Обратный вызов выполняется при вызове, ни больше, ни меньше. Например:

function printsSomething() {
  console.info("Something");
}
function invokesCallbackAtEnd(callback) {
  console.info("invokesCallbackAtEnd doing something");
  callback();
}
function invokesCallbackAtStart(callback) {
  callback();
  console.info("invokesCallbackAtStart doing something");
}
function invokesCallbackAtStartAndEnd(callback) {
  callback();
  console.info("invokesCallbackAtStartAndEnd doing something");
  callback();
}
function invokesCallbackNever(callback) {
  console.info("invokesCallbackNever doing something");
}
invokesCallbackAtEnd(printsSomething); console.info("---");
invokesCallbackAtStart(printsSomething); console.info("---");
invokesCallbackAtStartAndEnd(printsSomething); console.info("---");
invokesCallbackNever(printsSomething); console.info("---");

Если функция обратного вызова вызывается самой внешней функцией, то что это означает, когда вы говорите: «Обратный вызов выполняется при вызове, ни больше, ни меньше». Я понял из вашего примера сейчас, но все еще путаюсь.

vegabond 19.03.2019 09:38

Я имею в виду, что обратный вызов называется «обратный вызов», потому что он предназначен для «обратного вызова» из функции, которой вы его передали, где «вызов» означает то же, что и «вызов».

Amadan 19.03.2019 09:41

Вы не определяете функцию обратного вызова как таковую, для этого вам нужно будет передать ссылку на функцию, а не сам вызов функции. то есть fname(lname); И вы должны изменить свой function fname на

function fname (cb) {
  console.info("Billy");
  cb && cb.apply(this);
}

Вы не передали lname в качестве функции обратного вызова. Вы только что вызвали функцию lname и передали ей возвращаемое значение undefined.

И даже если вы передали функцию обратного вызова, ее точка выполнения зависит от кода.

function fname(func) {
  func("Foo");
  console.info("Billy");
  func("Bar");
}

function lname() {
  console.info("Smith");
  return function (arg) { console.info(arg); }
}
fname(lname());

Другие вопросы по теме