为什么回调函数首先在javascript中执行?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么回调函数首先在javascript中执行?相关的知识,希望对你有一定的参考价值。

在下面的例子中。 lname是fname函数内的回调函数。执行时,第一个输出是Smith和Billy。根据我的理解,一旦fname函数执行完毕,就应该执行回调函数lname。这里为什么错?

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

在下面的例子中。 lnamefname函数内部的回调函数。

不它不是。你正在调用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("---");
另一答案

函数的参数在调用之前进行计算。所以fname(lname())导致lname被调用,其次是fnamelname的结果作为第一个参数传递给fname,但被调用函数不使用它。

另一答案

您没有定义回调函数,为此,您必须将引用传递给函数而不是函数调用本身。即fname(lname);你必须改变你的function fname

function fname (cb) {
  console.log("Billy");
  cb && cb.apply(this);
}
另一答案

您没有将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());

以上是关于为什么回调函数首先在javascript中执行?的主要内容,如果未能解决你的问题,请参考以下文章

告诉你什么是javascript的回调函数

javaScript回调函数

JavaScript 异步操作之回调函数

javascript回调函数的理解

在setTimeout中调用多个函数

在 JavaScript 中调用/执行后是不是需要删除回调函数?