在浏览器的开发工具中暂停语句时,如何在该语句之后立即终止执行?

Posted

技术标签:

【中文标题】在浏览器的开发工具中暂停语句时,如何在该语句之后立即终止执行?【英文标题】:When paused on a statement within the browser's dev tools, how to terminate execution immediately after that statement? 【发布时间】:2012-05-01 01:56:27 【问题描述】:

假设我有这个功能:

function test () 

    // statements 1

    statement_X;

    // statements 2


我正在使用浏览器的开发工具逐步了解这些语句。现在,当我在“statement_X”处暂停时,我想终止函数执行(我不希望函数的“statements 2”部分被执行),就好像“statement_X”紧随其后return; 声明。

我知道 Chrome 有内联脚本编辑,所以我可以在暂停语句之后手动添加 return 语句,然后按 CTRL+S 重新执行整个事情,但我也需要这个功能 IE,所以我是希望有一个通用的解决方案。

提前终止执行似乎是一件很容易的事情(对于浏览器),所以我希望开发工具能够提供这样的功能。

【问题讨论】:

您是要停止执行此特定功能还是停止调试? @rcdmk "还是调试"?你的意思是?还是调试器?不,调试器应该不受此影响。 (我想停止函数的执行。) 比,我认为你没有运气,就像 Manishearth 指出的那样。 在 FireBug 中尝试过,认为它不可能。 【参考方案1】:

我在 IE 9 中成功测试了这个,所以我在这里发布它作为答案:在脚本调试器中暂停 statement_X 时,按 F10 以便仍然执行 statement_X,然后右键单击最后一行封闭函数(右大括号 终止函数体的行),然后从下拉菜单中选择“设置下一条语句”。这将跳过执行直到函数结束,就好像在 statement_X 之后有一个 void return 语句。

如果函数的最后一行有任何其他语句,如下面的代码所示,请注意右键单击大括号以使该技术起作用。

function test ()  alert("statement 1");
    alert("statement 2");  function test2 ()  alert("statement 3"); 

这对于内联函数或不用于调试的缩小脚本有时可能是必要的。

【讨论】:

设置下一条语句?酷:)最后一段是什么意思? @ŠimeVidas:哎呀!那真是又快又脏。刚刚添加了一些解释,现在应该清楚了。 @ft 我试过你的代码,我必须把插入符号放在花括号之前。在大括号之后单击 会导致错误弹出窗口显示“无法将下一条语句设置到此位置”。这是有道理的,因为花括号后面的区域不是当前函数执行的一部分,而是未执行的外部作用域的一部分。所以,只要点击大括号前的空格就可以了。 @ŠimeVidas 好的,我明白了。如果需要,请随时编辑答案。感谢您的接受。【参考方案2】:

如果我理解正确,你不能这样做。

调试器(无论如何都是 Chrome 的调试器)本身是基于 javascript 的。

这些家伙使用eval()(最终)运行注入的代码。浏览 Chrome 检查器,当您尝试评估某些东西时,调试器代码似乎最终会调用它(我认为):

function (evalFunction, object, expression, isEvalOnCallFrame, injectCommandLineAPI)

    // Only install command line api object for the time of evaluation.
    // Surround the expression in with statements to inject our command line API so that
    // the window object properties still take more precedent than our API functions.

    try 
        if (injectCommandLineAPI && inspectedWindow.console) 
            inspectedWindow.console._commandLineAPI = new CommandLineAPI(this._commandLineAPIImpl, isEvalOnCallFrame ? object : null);
            expression = "with ((window && window.console && window.console._commandLineAPI) || ) \n" + expression + "\n";
        
        return evalFunction.call(object, expression);
     finally 
        if (injectCommandLineAPI && inspectedWindow.console)
            delete inspectedWindow.console._commandLineAPI;
    

evalFunction 只是eval() 的别名。

问题是,我们不能在 eval 中使用 return 语句,即使在硬代码中也是如此。它会一直给你SyntaxError: Illegal return statement

所以不,没有伏都教返回声明。

【讨论】:

嗯,首先,可以(在 Chrome 中)在暂停的语句之后立即注入 return 语句,然后重新运行代码(通过按 CTRL+S)。我在我的问题中提到了这一点,这就是我正在寻找的。 (理想情况下,我想在调试器中有一个方便的“终止”按钮,这样我就不必手动插入返回语句并一直执行 CTRL+S。)问题是我想要在 IE 中使用这个功能没有热插拔(内联代码编辑)... @Šime 看起来像是通过本机函数。由于 Chrome 的调试器是 html,我可以为 Chrome 编写一个添加按钮的用户脚本。不过不确定。而且 IE 中没有。

以上是关于在浏览器的开发工具中暂停语句时,如何在该语句之后立即终止执行?的主要内容,如果未能解决你的问题,请参考以下文章

如何暂停语句执行和 UIalertview 在单独的循环上运行

oracle中date类型的数据怎么写sql语句

SQL语句where多条件查询怎么写?

sql语句,如何截取指定字段某一个字符出现后的后面的字符串吗

python程序如何让其暂停

如何清空所有数据库中所有表里的所有数据