当我读到我在2个timeSetout方法中设置(相同)时间时,我总是感到困惑,因为不能总是预测函数的调用顺序(没有提供推理)。
setTimeout(()=> console.log("first"), 5000);
setTimeout(()=> console.log("second"), 5000);
据我了解,超时将被添加到事件表中,该表跟踪事件(在这种情况下,事件是时间),然后将其发送到事件队列,事件队列存储事件的顺序。应该执行函数,然后事件循环检查并将这些函数发送到调用堆栈。
由于将第一个超时(记录为“ first”)首先添加到事件表中,所以我可以想象它是发送到事件队列的第一个(也考虑到事件队列是一个固定数据结构),并且在事件循环中首先发送到调用堆栈。
我在网上找不到任何东西,也没有理由为什么它可以随机执行,并且很乐意得到答案!
另外,还有一点要注意:有人可以解释什么时候可以出现竞争条件,就像上面的说法不正确一样,因为javascript是单线程的,所以我想不出任何情况。 谢谢!
答案 0 :(得分:1)
specification声明以下内容(强调):
如果方法上下文是Window对象,请等待,直到与方法上下文关联的文档在超时毫秒内完全处于活动状态(不一定连续) 。否则,方法上下文是WorkerGlobalScope对象。等到超时毫秒已经过去,且工作程序未暂停(不一定连续)。
等待直到该算法的任何调用都具有相同的方法上下文且该调用在该方法之前开始并且其超时相等 strong>达到或小于此水平,已完成。
据我所知,这应该确保执行顺序正确,并且您将始终看到first
,然后看到second
。