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

时间:2019-03-19 03:02:42

标签: javascript callback

在下面的示例中。 lname fname 函数中的回调函数。执行时,第一个输出是史密斯和比利。据我了解,一旦fname函数执行完毕,应执行回调函数 lname 。为什么这里错了?

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

4 个答案:

答案 0 :(得分:3)

在调用函数之前先评估函数的参数。因此fname(lname())导致lname被调用,随后是fnamelname的结果作为第一个参数传递给fname,但被调用的函数不使用。

答案 1 :(得分:2)

  

在下面的示例中。 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("---");

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

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