问题
Let's say I have this function:
function test () {
// statements 1
statement_X;
// statements 2
}
I'm stepping trough the statements with the browser's dev tools. Now, when I'm paused at "statement_X", I would like to terminate the function execution (I don't want the "statements 2" part of the function to be executed), as if the "statement_X" is immediately followed by a return; statement.
I know that Chrome has inline script editing, so I could manually add the return statement after the paused statement and then hit CTRL+S to re-execute the entire thing, but I need this feature for IE too, so I am hoping for a general solution.
Terminating execution early seems like an easy enough thing to do (for the browser), so I expect such a functionality from the dev tools.

回答1:
I tested this successfully in IE 9, so I'm posting it here as an answer: while pausing at statement_X in the script debugger, hit F10 so statement_X is still executed, then right click on the last line of the enclosing function (the line with the right curly bracket } that terminates the function body), and select "Set next statement" from the drop down menu. This will skip execution until the end of the function as if there were a void return statement just after statement_X.

If there are any other statements on the last line of a function as shown in the code below, be careful to right click just on the curly bracket for this technique to work.
function test () { alert("statement 1");
alert("statement 2"); } function test2 () { alert("statement 3"); }
This may be sometimes necessary in the case of inline functions, or in minified scripts not intended for debugging.
回答2:
If I understand correctly, you can't do this.
The debuggers (Chrome's debugger at any rate) are themselves javascript-based.
These guys use eval()(eventually) to run the injected Code. Trawling through Chrome inspector, it seems that the debugger code eventually calls this when you try to evaluate something (I think):
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 is just an alias for eval().
The issue is, we cannot use return statements in eval, even in hard code. It will always give you SyntaxError: Illegal return statement.
So no, no voodoo return statement.
来源:https://stackoverflow.com/questions/10229996/when-paused-on-a-statement-within-the-browsers-dev-tools-how-to-terminate-exec