caller
返回一個對函數的引用,該函數調用了當前函數。
functionName.caller
functionName 對象是所執行函數的名稱。
說明
對於函數來說,caller屬性只有在函數執行時纔有定義。如果函數是由頂層調用的,那麼 caller包含的就是 null 。如果在字符串上下文中使用 caller屬性,那麼結果和 functionName.toString 一樣,也就是說,顯示的是函數的反編譯文本,
注意:Function.toString() 可以實現 Function 的反編譯功能.如加上遞歸功能則功能更加強大
例子一
<span style="font-size:18px;"><span style="font-size:18px;"><script type="text/javascript">
function callerdemo() {
if (callerdemo.caller) {
var a= callerdemo.caller.toString();
alert(a);
} else {
alert('this is a top function');
}
};
callerdemo();
</script>
</span></span>
例子一中由於callerdemo是由頂層調用,所以callerdemo.caller 包含的就是null,故而輸出值是 “this is a top function”
例子二
<span style="font-size:18px;"><script type="text/javascript">
window.οnlοad=function(){
function callerdemo() {
if (callerdemo.caller) {
var a= callerdemo.caller.toString();
alert(a);
} else {
alert('this is a top function');
}
};
callerdemo();
}
</script></span>
function(){
function callerdemo() {
if (callerdemo.caller) {
var a= callerdemo.caller.toString();
alert(a);
} else {
alert('this is a top function');
}
};
callerdemo();
}
例子三
<span style="font-size:18px;"> function callerdemo() {
if (callerdemo.caller) {
var a= callerdemo.caller.toString();
alert(a);
} else {
alert('this is a top function');
}
};
function handlecaller() {
callerdemo();
};
handlecaller();</span>
例子三和例子二一樣,都是一個對調用函數的應用,返回值是:
function handlecaller() {
callerdemo();
};
callee
返回正被執行的 Function 對象,也就是所指定的 Function 對象的正文。[function.]arguments.callee可選項 function參數是當前正在執行的 Function對象的名稱。說明callee屬性的初始值就是正被執行的 Function 對象。callee屬性是 arguments 對象的一個成員,它表示對函數對象本身的引用,這有利於匿名函數的遞歸或者保證函數的封裝性,例如下邊示例的遞歸計算1到n的自然數之和。而該屬性僅當相關函數正在執行時纔可用。還有需要注意的是callee擁有length屬性,這個屬性有時候用於驗證還是比較好的。arguments.length是實參長度,arguments.callee.length是形參長度,由此可以判斷調用時形參長度是否和實參長度一致。
<span style="font-size:18px;"><script type="text/javascript">
function callerdemo() {
alert(arguments.callee);
};
callerdemo();
</script></span>
返回的即是callerdemo 函數本身。
<span style="font-size:18px;"> function callerdemo() {
alert(arguments.callee.length+","+arguments.length);
};
callerdemo(5);</span>
輸出調用時形參長度和實參長度
<span style="font-size:18px;">function callerdemo(n) {
if(n==0) return false;
console.log(n);
callerdemo(n-1);
};
callerdemo(5);</span>
輸出 5,4,3,2,1;
<span style="font-size:18px;"> function callerdemo(n) {
if(n==1) return 1;
return n*callerdemo(n-1);
};
console.log(callerdemo(5));</span>
輸出120;
<span style="font-size:18px;"> function callerdemo(n) {
if(n==1) return 1;
return n*arguments.callee(n-1);
};
console.log(callerdemo(5));</span>
輸出120;