为什么在javascript中首先执行回调函数?
在下面的例子中。lname是fname函数中的回调函数。执行时,第一个输出是Smith和Billy。根据我的理解,回调函数lname应该在fname函数执行完毕后执行。为什么我在这里错了为什么在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,
函数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
的结果作为参数传递……如果回调函数被最外层的函数回调,那么当您说“回调在被调用时执行,不多也不少”是什么意思呢我现在理解了你的例子,但仍然感到困惑。我的意思是回调被称为“回调”,因为它是从你传递给它的函数中“回调”的,其中“调用”与“调用”的意思相同。