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

时间:2012-07-20 13:57:17

标签: javascript debugging javascript-debugger

我有一些非常奇怪的行为。我有以下JQuery:

myElement.fadeOut(100);

存在某种竞争条件,因此该元素最终不会被隐藏。如果我在该行上放置一个调试器并逐步执行代码,它就可以正常运行并且元素会淡出并隐藏起来。称之为Heisenbug

我的问题不是竞争条件本身 。鉴于JavaScript运行时的性质,我想知道如何实现这一点。根据我的理解,以下谓词是正确的:

  1. fadeOut()由JQuery animate()
  2. 实现
  3. animate()由一系列setTimeout()来电
  4. 实施
  5. setTimeout()计划在某个时间点在队列中执行函数
  6. 当事件到达队列的开头时,执行该功能。
  7. 只有一个事件循环,按顺序执行。
  8. 在任何给定的时间点,只有一个通过callstack的函数/路径正在执行。
  9. 鉴于我在调试器中单步调试函数,必须暂停执行,并且不能执行其他函数。

    我看不出在这种情况下如何出现竞争条件。 您能否建议在已调试和未调试的代码之间执行的可能性如何?

1 个答案:

答案 0 :(得分:2)

您的要点是正确的,但如果浏览器支持requestAnimationFrame(),则使用{{3}}代替setTimeout()

例如,如果通过AJAX调用异步创建myElement,但调用fadeOut()而不等待请求完成,则调试会话会对代码的行为产生影响。< / p>

在这种情况下,手动单步执行代码可以为返回请求提供足够的时间,并且在调用fadeOut()之前创建元素,而在正常情况下请求不会返回。 / p>