?? 20-5 “callee”和“caller”屬性的應用.htm
字號:
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=GB2312" />
<title>20-5 “callee”和“caller”屬性的應用</title>
<style>
* { font-size:12px; font-family:宋體, Arial; } /*規定了所有的字體樣式*/
body { overflow:auto; }
</style>
<script>
//用于輸出的函數
function print(str){ document.write(str+"<br>"); }
function println(){ document.write("<hr>"); }
//向字符串對象原型中增加方法“times”,用于將此字符串按指定次數重復的后返回
String.prototype.times = function(count){
return(count<1?"":(new Array(count+1)).join(this));
}
//向數組對象原型中增加方法“indentJoin”,用于將此數組按順序增加相應縮進,然后合并成一個字符串返回
Array.prototype.indentJoin = function(linkStr, indentChar, indentLen){
var tmp = new Array();
indentChar = indentChar || " ";
indentLen = indentLen || 4;
for(var i=0; i<this.length; i++){
tmp.push(indentChar.times(i*indentLen)+this[i]);
}
return(tmp.join(linkStr));
}
//模擬函數之間的相互調用
function main(){ sub1(1, 3, 5, 7); }
function sub1(){ sub2(2, "hutia", 6, "humi"); }
function sub2(){ sub3(1, 1, 2, 3); }
function sub3(){ sub4("axiang", 8, "hutia", 21); }
function sub4(){
try{
//模擬一個錯誤
var ss=tt;
}catch(e){
//在錯誤捕獲中調用“debug”函數
debug(e);
}
}
//使用“callee”和“caller”屬性自動獲取調試信息
function debug(e){
var f, fname, re, arg, depth;
f = arguments.callee.caller;
re = new Array();
while(f){
arg = new Array();
fname = f.toString().match(/function\s+([^\(]+)/);
fname = fname?fname[1]:"Anonymous";
for(var i=0; i<f.arguments.length; i++)arg.push(toJString(f.arguments[i]));
re.push("--> "+fname+"("+arg.join(", ")+")");
f = f.caller;
}
re.reverse();
print("有一個錯誤發生");
println();
for(var i in e)print(i+":"+e[i]);
println();
print("錯誤發生位置:<br>"+re.indentJoin("<br>", " ", 2));
}
//將對象序列化
function toJString(obj){
switch(typeof(obj)){
case "string": return("\""+obj+"\"");
case "object": return("[object]");
default: return(String(obj));
}
}
//調用“main”函數
main();
</script>
</head>
<body>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -