要点:闭包能够把外围函数的调用对象保留起来,调用对象包含外围函数此时的局部变量(函数参数和局部变量),
因此,在闭包里访问外围函数的局部变量的值为此时函数的的局部变量值。
<script> /** * 断点功能 * 摘自《javaScript权威指南》,最终出处Steve Yen * 见http://trimpath.com/project/wiki/TrimBreakpoint * * 使用window.prompt来阻塞浏览器,使函数断点。使用 * inspector来获取变量值。 */ function inspect(inspector,title){ var expression,title; if("ignore" in arguments.callee) return; while(true){ var message = ""; if(title) message = title+"\n"; if(expression) message += "\n" + expression + " ==> " + result + "\n" ; else expression = ""; message += "Enter an expression to evaluate:"; /* window.prompt(message,default) 第一个参数为显示的信息,第二个参数为 * 输入框的默认值,返回值为用户输入的字符串 */ expression = prompt(message,expression); if(!expression) return; result = inspector(expression); } } /* 以下是一个求阶函数,它是一个使用insepct函数来断点的例子,其实每次调用inspect * 都是一次断点。其中调用前要用到inspector函数,用它来获取变量值。*/ function factorial(n){ var result =1; /* 闭包,把外围函数的调用对象(包含所有函数参数和局部变量) * inspector函数把此时的factorial的调用对象保留起来,但调用 * inspector时,它的作用域链里的第二个对象就是此时factorial * 的调用对象,此次,当inspector访问一个外围函数的变量(如 * result)时,此时外围函数result的值是什么就返回什么,达到 * 实时观察的效果。 */ var inspector = function($){return eval($);} inspect(inspector,"Entering factorial()"); while(n > 1){ result = result*n; n--; inspect(inspector,"factorial() loop"); } inspect(inspector,"Exiting factorial()"); return result; } //运行函数,看断点效果。 factorial(2); </script>