Created
September 14, 2011 13:44
-
-
Save gnepud/1216580 to your computer and use it in GitHub Desktop.
Example of breakpoints using closures for JavaScript
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// http://www.davidflanagan.com/javascript5/display.php?n=8-7&f=08/07.js | |
// This function implements a breakpoint. It repeatedly prompts the user | |
// for an expression, evaluates it with the supplied self-inspecting closure, | |
// and displays the result. It is the closure that provides access to the | |
// scope to be inspected, so each function must supply its own closure. | |
// | |
// Inspired by Steve Yen's breakpoint() function at | |
// http://trimpath.com/project/wiki/TrimBreakpoint | |
// | |
function inspect(inspector, title) { | |
var expression, result; | |
// You can use a breakpoint to turn off subsequent breakpoints by | |
// creating a property named "ignore" on this function. | |
if ("ignore" in arguments.callee) return; | |
while(true) { | |
// Figure out how to prompt the user | |
var message = ""; | |
// If we were given a title, display that first | |
if (title) message = title + "\n"; | |
// If we've already evaluated an expression, display it and its value | |
if (expression) message += "\n" + expression + " ==> " + result + "\n"; | |
else expression = ""; | |
// We always display at least a basic prompt: | |
message += "Enter an expression to evaluate:"; | |
// Get the user's input, displaying our prompt and using the | |
// last expression as the default value this time. | |
expression = prompt(message, expression); | |
// If the user didn't enter anything (or clicked Cancel), | |
// they're done and so we return, ending the breakpoint. | |
if (!expression) return; | |
// Otherwise, use the supplied closure to evaluate the expression | |
// in the scope that is being inspected. | |
// The result will be displayed on the next iteration. | |
result = inspector(expression); | |
} | |
} | |
function factorial(n) { | |
// Create a closure for this function | |
var inspector = function($) { return eval($); } | |
inspect(inspector, "Entering factorial()"); | |
var result = 1; | |
while(n > 1) { | |
result = result * n; | |
n--; | |
inspect(inspector, "factorial() loop"); | |
} | |
inspect(inspector, "Exiting factorial()"); | |
return result; | |
} | |
// Run test | |
factorial(5); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment