要点:闭包能够把外围函数的调用对象保留起来,调用对象包含外围函数此时的局部变量(函数参数和局部变量),
因此,在闭包里访问外围函数的局部变量的值为此时函数的的局部变量值。
<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>