在浏览器的开发工具中暂停语句时,如何在该语句之后立即终止执行?
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 在单独的循环上运行