Web 检查器参考JavaScript 断点

如果您曾使用 Xcode 调试应用程序,Web 检查器支持许多相同的功能,包括设置断点。

在 JavaScript 资源(或 HTML 资源中的任何内联 <script>)的行号栏(显示行号的地方)中的任何行上点击(或右键点击并在上下文菜单中选择**添加断点**),将在该行设置一个*JavaScript 断点*。

这意味着当 JavaScript 即将执行该行时,它会在执行该行之前暂停 JavaScript 执行,从而允许您在该点调查正在发生的事情。

如果某行足够复杂,以至于存在多个可能的断点位置,则会在每个位置显示内联断点,从而可以更精细地控制 JavaScript 执行在行的确切位置暂停。

*JavaScript 断点*在 Web 检查器会话之间保留,但它们仅在当前页面中存在与该*JavaScript 断点*的 URL 匹配的脚本时才会重新添加(例如,当检查 http://b.com/index.js 时,不会显示来自 http://a.com/index.js 的*JavaScript 断点*)。

特殊断点

除了基于行的*JavaScript 断点*外,还有一些特殊的*JavaScript 断点*是全局生效的,与行号无关。

  • 如果启用,**调试器语句***JavaScript 断点*将在任何 debugger 语句执行时暂停 JavaScript 执行。
  • 如果启用,**所有异常***JavaScript 断点*将在抛出任何异常时暂停 JavaScript 执行。
  • **未捕获异常** *JavaScript 断点*与**所有异常** *JavaScript 断点*类似,但它仅在抛出的异常未被捕获时暂停。
    • 此*JavaScript 断点*本质上是**所有异常** *JavaScript 断点*的一个子集,因此当**所有异常** *JavaScript 断点*启用时,它将被禁用。
  • **断言失败**是一个在开发时非常有用的*JavaScript 断点*,当调用console.assert时,它将暂停 JavaScript 执行。
  • **所有微任务** *JavaScript 断点*将在任何微任务执行之前暂停 JavaScript 执行,包括传递给 queueMicrotask 或用作 Promise 链一部分的函数。

上述*JavaScript 断点*是特殊的,因为它们是全局的,不能被删除/移除,只能被禁用。

然而,**断言失败**和**所有微任务** *JavaScript 断点*是上述规则的例外,因为它们可以被删除/移除。如果您删除了其中任何一个并想将其添加回来,只需点击 **源代码**选项卡_导航侧边栏_中**断点**部分右上角的 [**创建断点**] 即可。

配置

*JavaScript 断点*有一些不同的配置选项,可以通过右键点击并在上下文菜单中选择**编辑断点…**来访问。

**条件**输入允许您限制*JavaScript 断点*,使其仅在给定 JavaScript 计算结果为真值时才暂停 JavaScript 执行。这对于您只想在满足特定条件(例如变量具有特定值)时才暂停 JavaScript 执行的情况非常有用。请记住,包含的 JavaScript 在*JavaScript 断点*被命中时进行评估,并且根据您作为条件运行的代码,可能会产生额外的副作用。

然而,您可能不希望执行任意代码,而只是想忽略*JavaScript 断点*被命中的前几次。如果是这种情况,将**忽略**输入设置为任何正整数将阻止*JavaScript 断点*暂停执行,直到它被命中那么多次。

现在您可能想知道什么是**操作**。有四种不同类型

  • 日志消息

    这基本上是使用 console.log 记录值的“快捷方式”。您提供的字符串的行为类似于模板字面量,这意味着只要它在 ${…} 内,您就可以评估任意 JavaScript。

  • 评估 JavaScript

    这可以说是最强大的*JavaScript 断点***操作**,它允许您在命中*JavaScript 断点*时评估任何任意 JavaScript。给定的 JavaScript 执行时就好像它在代码行之前一样,这意味着它将可以访问相关行之前在该作用域中可用的所有变量。

  • 播放声音

    添加其中一个操作将导致 Web 检查器在命中*JavaScript 断点*时播放系统蜂鸣声。

  • 探针表达式

    **探针表达式**可以被看作是一个迷你**控制台**。每当相关的*JavaScript 断点*被命中时,**探针表达式**都会被评估,结果会保存在**源代码**选项卡_详细信息侧边栏_的**探针**面板中,让您可以看到表达式的结果在程序生命周期中是如何变化的。您可以使用此功能观察特定变量(例如 this)的变化,或整个表达式(例如 this.foo === "bar")的变化。

如果设置了任何**操作**,您还可以将*JavaScript 断点*配置为**评估后自动继续**。这将使*JavaScript 断点*在实际中变得“不可见”,因为它永远不会暂停执行。**评估后自动继续**的*JavaScript 断点*在图标中会有一个小的白色三角形(“空心”):

状态

*JavaScript 断点*可以被启用 或禁用 。理想情况下,*JavaScript 断点*将始终处于启用状态 ,但它们也可能因以下几个原因而被禁用

  • 该*JavaScript 断点*被手动禁用 。在**源代码**选项卡_导航侧边栏_的任何断点图标上,或在任何文本编辑器的行号栏中点击(或右键点击并在上下文菜单中选择**启用断点**或**禁用断点**),都可以在启用 和禁用 之间切换。
  • 该*JavaScript 断点*的位置解析到不是 JavaScript 的代码行。也可以在 HTML 文件中设置*JavaScript 断点*,旨在帮助调试内联 <script>,但如果将*JavaScript 断点*放置在非 <script> 行上,它将永久禁用
  • 断点已被全局禁用 。全局断点控制是一个按钮,其外观与位于**源代码**选项卡_导航侧边栏_顶部的断点图标完全相同。

当右键点击任何*JavaScript 断点*时,所有启用/禁用/删除切换都可在上下文菜单中找到。当右键点击相关资源时,这些切换也存在于上下文菜单中,并将应用于该资源中设置的所有*JavaScript 断点*。

图标图例

  • 已启用(全局断点已启用)
  • 已启用(全局断点已启用)并自动继续
  • 已禁用(全局断点已启用)
  • 已禁用(全局断点已启用)并自动继续
  • 已启用(全局断点已禁用)
  • 已启用(全局断点已禁用)并自动继续
  • 已禁用(全局断点已禁用)
  • 已禁用(全局断点已禁用)并自动继续

针对 Safari 技术预览 154 更新。立即试用,获取最新的 Web 检查器功能,包括上述所有功能及更多。


撰写于 2020 年 1 月 14 日,作者:Brian BurgDevin RoussoJoseph PecoraroTimothy Hatcher

最后更新于 2022 年 9 月 22 日,作者:Devin Rousso