在下面的示例中。 lname 是 fname 函数中的回调函数。执行时,第一个输出是史密斯和比利。据我了解,一旦fname函数执行完毕,应执行回调函数 lname 。为什么这里错了?
function fname(){ console.log("Billy");}
function lname(){ console.log("Smith");}
fname(lname());
答案 0 :(得分:3)
在调用函数之前先评估函数的参数。因此fname(lname())
导致lname
被调用,随后是fname
。 lname
的结果作为第一个参数传递给fname
,但被调用的函数不使用。
答案 1 :(得分:2)
在下面的示例中。
lname
是fname
函数内部的回调函数。
不,不是。您正在调用 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());