传递嵌套回调作为参数javascript?

时间:2017-05-03 15:50:01

标签: javascript callback

我有一个像这样的代码块

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?

4 个答案:

答案 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(未定义),这就是你得到的原因 - 回调不是函数