В приведенном ниже примере. имя — это функция обратного вызова внутри функции имя. При выполнении первым результатом будет Смит и Билли. Насколько я понимаю, функция обратного вызова имя должна выполняться после завершения выполнения функции fname. Почему я ошибаюсь здесь?
function fname(){ console.info("Billy");}
function lname(){ console.info("Smith");}
fname(lname());


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Аргументы функции оцениваются до ее вызова. Таким образом, fname(lname()) приводит к вызову lname, за которым следует fname. Результат lname передается fname в качестве первого аргумента, но не используется вызываемой функцией.
In the below example.
lnameis callback function insidefnamefunction.
Нет это не так. Вы призываяlname (потому что вы добавили круглые скобки) и передаете результат своего вызова (который оказывается undefined, как в случае любого случая, когда функция явно не return значение) в fname. Как и Math.floor(Math.sqrt(10)) — здесь нет обратных вызовов. Между fname(lname()) и fname(lname) есть большая разница: последний передает саму функцию в другую функцию; и мы назовем это «обратным вызовом», если он действительно вызывается.
As per my understanding, callback function
lnameshould be executed oncefnamefunction 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("---");Если функция обратного вызова вызывается самой внешней функцией, то что это означает, когда вы говорите: «Обратный вызов выполняется при вызове, ни больше, ни меньше». Я понял из вашего примера сейчас, но все еще путаюсь.
Я имею в виду, что обратный вызов называется «обратный вызов», потому что он предназначен для «обратного вызова» из функции, которой вы его передали, где «вызов» означает то же, что и «вызов».
Вы не определяете функцию обратного вызова как таковую, для этого вам нужно будет передать ссылку на функцию, а не сам вызов функции. то есть
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());
Поскольку вы не передаете
lnameв качестве обратного вызова (функция в качестве аргумента), вы фактически передаете результатlnameв качестве аргумента...