我們先來看下caller.
caller:返回一個對函式(該函式呼叫了當前函式)的引用。
functionName.caller:functionName物件是所執行函式的名稱。
說明
對於函式來說,caller 屬性只有在函式執行時才有定義。如果函式是由頂層呼叫的,那麼 caller 包含的就是 null 。如果在字串上下文中使用 caller 屬性,那麼結果和 functionName.toString 一樣,也就是說,顯示的是函式的反編譯文字。 下面的例子說明了 caller 屬性的用法:
function callerDemo() {
if (callerDemo.caller) {
alert(callerDemo.caller.toString());
} else {
alert("this is a top function");
}
}
function handleCaller() {
callerDemo();
}
我們再來看看callee:
callee:返回正被執行的Function物件,也就是所指定的Function物件的正文。
[function.]arguments.callee :可選項 function 引數是當前正在執行的 Function 物件的名稱。
說明
callee 屬性的初始值就是正被執行的 Function 物件。 callee 屬性是 arguments 物件的一個成員,它表示對函式物件本身的引用,這有利於匿名 函式的遞迴或者保證函式的封裝性,例如下邊示例的遞迴計算1到n的自然數之和。而該屬性 僅當相關函式正在執行時才可用。還有需要注意的是callee擁有length屬性,這個屬性有時候 用於驗證還是比較好的。arguments.length是實參長度,arguments.callee.length是 形參長度,由此可以判斷呼叫時形參長度是否和實參長度一致。
示例
比較一般的遞迴函式:呼叫時:alert(sum(100)); 其中函式內部包含了對sum自身的引用,函式名僅僅是一個變數名,在函式內部呼叫sum即相當於呼叫 一個全域性變數,不能很好的體現出是呼叫自身,這時使用callee會是一個比較好的方法。
//callee可以列印其本身
function calleeDemo() {
alert(arguments.callee);
}
//用於驗證引數
function calleeLengthDemo(arg1, arg2) {
if (arguments.length==arguments.callee.length) {
window.alert("驗證形參和實參長度正確!");
return;
} else {
alert("實參長度:" +arguments.length);
alert("形參長度: " +arguments.callee.length);
}
}
//遞迴計算
var sum = function(n){
if (n <= 0)
return 1;
else
return n +arguments.callee(n - 1)
}
var sum = function(n){
if (1==n) return 1;
else return n + sum (n-1);