我正在读一本名为你不懂JS:Async and Performance 的书。他们给出了嵌套回调问题的以下示例,我想知道是否有人可以为我详细说明具体细节。
doA (function(){
doC();
doD(function(){
doF();
})
doE();
});
doB();
根据作者的说法,代码将按字母顺序表示的顺序执行。意思是doA,然后doB ....我可能已经能够根据经验猜测这一点,但我正在努力更好地理解为什么会发生这种情况。
编辑:我发布了这个问题,因为书中的例子对我没有任何意义,我希望得到一些澄清。也许我应该说,而不是试图用一些解释来拯救作者。我稍微编辑了一下这个问题,试着说清楚。
答案 0 :(得分:0)
是因为事件循环运行整个外部"包装器"首先在它启动内包装之前?
没有。如果执行的顺序确实是A,B,C,D,E,F,那么这是因为这是函数被编写以调用它们的回调的方式。如果函数的写法不同,它可以很容易地成为A,C,D,E,F,B或A,C,D,F,E,B,或者它甚至可能只是A,B,如果A确实如此不接受回调函数。
所有这些猜测......
这是我认为正在发生的事情。事件循环首先创建为doA和doB,因为JavaScript并不真正关注"首先是这些行的内容。当JavaScript运行行doA(函数...然后它将回调函数添加到事件循环的末尾,将doC和doD放在doB后面。
......或多或少是胡说八道。
这是一个极其简化的例子:
function doA(callback) { callback(); }
doA(function () {
doB()
});
doC();
这里的顺序是A,B,C,因为这就是A的写法。
但是,如果我们更改doA
,那么它会异步调用其回调...
function doA(callback) { setTimeout(callback); }
...然后订单完全变为A,C,B。
这有无事可做,JavaScript正在关注"使用任何内部或外部代码,或 JavaScript "选择"将回调放在"事件循环中#34;。这些都不是真实的东西。 JavaScript没有"选择"做任何事。它只是执行你的代码。它完全取决于每个函数的作用以及函数是否接受回调以及如何调用该回调。