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

问题描述 投票:0回答:4

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

function fname(){ console.log("Billy");}
function lname(){ console.log("Smith");}
fname(lname());
javascript callback
4个回答
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("---");

3
投票

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


2
投票

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

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

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());
© www.soinside.com 2019 - 2024. All rights reserved.