我有一个像这样的代码块
function doA (callback) {
//do something...
callback();
}
function doB (callback) {
//do something...
callback();
}
function doC () {
//do something...
}
我知道这是一种不好的做法,必须避免它,但我想知道为什么当我把这些功能称为
doA(doB(doC)));
它抛出一个错误,"回调不是一个函数" ? 但是当我尝试时:
doA(doC);
一切都很好。
编辑:我试图使用chrome dev工具来弄清楚javascript callstack如何工作,我发现调用堆栈就像:
doC
doB
没有doA功能,为什么js避免将doA()添加到callstack?
答案 0 :(得分:0)
因为doB
它没有返回功能。
该表达式意味着doB
的输出作为参数传递给doA
,但由于doB
未返回函数,因此会出现错误。
答案 1 :(得分:0)
您传递doB(doC)
的结果作为doA
的参数,但它不是函数:
doB(doC); // undefined
doA(undefined); // throws: callback is not a function
答案 2 :(得分:0)
它抛出一个错误,"回调不是一个函数" ?
您调用doA
并将doB(doC)
的返回值作为第一个参数传递。
doB
没有return
语句,因此返回undefined
。
doA
尝试将第一个参数(值为undefined
)作为一个函数调用,它不是,所以它失败了。
它并不完全清楚你想要实现的目标(因为你的示例代码被抽象了很多),但你应该调查the Promises API,它可以让你做类似的事情:
doA().then(doB).then(doC);
答案 3 :(得分:0)
对于回调,您需要传递函数,doB(doC)将执行它并返回undefined。那个未定义的值将被传递给doA(未定义),这就是你得到的原因 - 回调不是函数