在下面的例子中。 lname是fname函数内的回调函数。执行时,第一个输出是Smith和Billy。根据我的理解,一旦fname函数执行完毕,就应该执行回调函数lname。这里为什么错?
function fname(){ console.log("Billy");}
function lname(){ console.log("Smith");}
fname(lname());
在下面的例子中。
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("---");
函数的参数在调用之前进行计算。所以fname(lname())
导致lname
被调用,其次是fname
。 lname
的结果作为第一个参数传递给fname
,但被调用函数不使用它。
您没有定义回调函数,为此,您必须将引用传递给函数而不是函数调用本身。即fname(lname);
你必须改变你的function fname
function fname (cb) {
console.log("Billy");
cb && cb.apply(this);
}
您没有将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());