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

为什么在javascript中首先执行回调函数?,javascript,callback,Javascript,Callback,在下面的例子中。lname是fname函数中的回调函数。执行时,第一个输出是Smith和Billy。根据我的理解,回调函数lname应该在fname函数执行完毕后执行。为什么我在这里错了 函数fname(){console.log(“Billy”);} 函数lname(){console.log(“Smith”);} fname(lname())函数的参数在调用之前进行求值。因此,fname(lname())导致调用lname,然后是fname。lname的结果作为第一个参数传递给fname,

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

函数fname(){console.log(“Billy”);}
函数lname(){console.log(“Smith”);}

fname(lname())函数的参数在调用之前进行求值。因此,
fname(lname())
导致调用
lname
,然后是
fname
lname
的结果作为第一个参数传递给
fname
,但被调用函数不使用它

在下面的例子中
lname
fname
函数中的回调函数

不,不是。您正在调用
lname
(因为您添加了括号),并将其调用结果传递给
fname
(与函数未显式
返回值时的情况一样,调用结果恰好是
未定义的
)。就像
Math.floor(Math.sqrt(10))
-这里没有回调。
fname(lname())
fname(lname)
之间有很大区别:后者将一个函数本身传递给另一个函数;如果它实际上被回调了,我们将称之为“回调”

根据我的理解,回调函数
lname
应该在
fname
函数执行完毕后执行

同样地,没有。回调在被调用时执行,不多也不少。例如:

函数printsMething(){
console.log(“某物”);
}
函数invokesCallbackAtEnd(回调){
log(“invokesCallbackAtEnd do something”);
回调();
}
函数invokesCallbackAtStart(回调){
回调();
log(“invokesCallbackAtStart do something”);
}
函数invokesCallbackAtStartAndEnd(回调){
回调();
log(“invokesCallbackAtStartAndEnd do something”);
回调();
}
函数invokesCallbackNever(回调){
log(“invokescallback从不做某事”);
}
调用Callbackatend(打印方法);console.log(“--”);
调用CallbackAtStart(打印方法);console.log(“--”);
调用CallbackatStartAndEnd(打印方法);console.log(“--”);

调用CallbackNever(PrintsMething);console.log(“--”)您没有这样定义回调函数,要这样做,您必须将引用传递给函数,而不是函数调用本身。即
fname(lname)
并且您必须将
函数fname
更改为

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

您没有将
lname
作为回调函数传递。您刚刚调用了
lname
函数并传递了其返回值
undefined

即使传递了回调函数,其执行点也取决于代码

函数fname(func){
func(“Foo”);
控制台日志(“比利”);
func(“酒吧”);
}
函数lname(){
控制台日志(“史密斯”);
返回函数(arg){console.log(arg);}
}

fname(lname())
因为您没有将
lname
作为回调传递(函数作为参数),所以实际上您是将
lname
的结果作为参数传递……如果回调函数被最外层的函数回调,那么当您说“回调在被调用时执行,不多也不少”是什么意思呢我现在理解了你的例子,但仍然感到困惑。我的意思是回调被称为“回调”,因为它是从你传递给它的函数中“回调”的,其中“调用”与“调用”的意思相同。