JS调试器是否挂起整个JS事件循环



我有一些非常奇怪的行为

myElement.fadeOut(100);

有某种种族状况在发生,这样元素就不会被隐藏起来。如果我在那一行上放了一个调试器,并逐步遍历代码,它会很好地工作,元素会逐渐消失并隐藏起来。称之为海森堡。

我的问题不是关于比赛条件本身。我想知道,鉴于JavaScript运行时的性质,这种情况是如何发生的。根据我的理解,以下断言是正确的:

  1. fadeOut()由JQuery animate()实现
  2. animate()由一系列setTimeout()调用实现
  3. setTimeout()在某个时间点调度队列中函数的执行
  4. 当事件到达队列的开头时,将执行该函数
  5. 只有一个按顺序执行的事件循环
  6. 在任何给定的时间点,只有一个通过调用堆栈的函数/路径在执行

假设我正在调试程序中逐步执行一个函数,则必须暂停执行,并且不能执行其他函数。

我看不出在这种情况下怎么可能出现种族状况您能建议调试代码和未调试代码之间的执行有何不同吗

您的要点是正确的,只是如果浏览器支持,则使用requestAnimationFrame()而不是setTimeout()

调试会话可能会对代码的行为产生影响,例如,如果通过AJAX调用异步创建myElement,但在不等待请求完成的情况下调用fadeOut()

在这种情况下,手动遍历代码可以为请求返回和在调用fadeOut()之前创建元素提供足够的时间,而在正常情况下,请求还没有返回。

最新更新