Почему функция обратного вызова выполняется в первую очередь в JavaScript? - PullRequest
0 голосов
/ 19 марта 2019

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

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

Ответы [ 4 ]

3 голосов
/ 19 марта 2019

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

2 голосов
/ 19 марта 2019

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

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

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

function lname() {
  console.log("Smith");
  return function (arg) { console.log(arg); }
}
fname(lname());
2 голосов
/ 19 марта 2019

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

function fname (cb) {
  console.log("Billy");
  cb && cb.apply(this);
}
2 голосов
/ 19 марта 2019

В приведенном ниже примере.lname является функцией обратного вызова внутри fname функции.

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

Насколько я понимаю, функция обратного вызова lname должна быть выполнена, как только функция fname будет завершена..

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

function printsSomething() {
  console.log("Something");
}
function invokesCallbackAtEnd(callback) {
  console.log("invokesCallbackAtEnd doing something");
  callback();
}
function invokesCallbackAtStart(callback) {
  callback();
  console.log("invokesCallbackAtStart doing something");
}
function invokesCallbackAtStartAndEnd(callback) {
  callback();
  console.log("invokesCallbackAtStartAndEnd doing something");
  callback();
}
function invokesCallbackNever(callback) {
  console.log("invokesCallbackNever doing something");
}
invokesCallbackAtEnd(printsSomething); console.log("---");
invokesCallbackAtStart(printsSomething); console.log("---");
invokesCallbackAtStartAndEnd(printsSomething); console.log("---");
invokesCallbackNever(printsSomething); console.log("---");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...