callee
是對象的一個屬性,該屬性是一個指針,指向參數(shù)arguments
對象的函數(shù)
首先我們來寫個階成函數(shù):
function chen(x){
if (x<=1) {
return 1;
} else{
return x*chen(x-1);
};
};
從這個函數(shù)中可以看出來,用到了遞歸函數(shù),要是改變了函數(shù)名,里面的函數(shù)名也要隨著改變,這樣很不方便所以我們用callee
來試試
function chen(x){
if (x<=1) {return 1;
}else{
return x*arguments.callee(x-1);
};
};
我們來分析一下為什么這樣寫:根據(jù)callee
的定義,可以看出來callee
是arguments
對象的一個屬性,指向arguments對象的函數(shù),這個函數(shù)就是chen(chen=arguments.callee)
,這樣解釋應該可以理解了吧。
caller
是函數(shù)對象的一個屬性,該屬性保存著調用當前函數(shù)的函數(shù)的引用(指向當前函數(shù)的直接父函數(shù))
先來個例子吧
function a(){
b();
};
function b(){
alert(b.caller);
};
a(); //結果就是彈出函數(shù)a和內容
我們來解釋一下吧,首先函數(shù)b的屬性caller
調用當前函數(shù)b的函數(shù)引用a(就是指向當前函數(shù)b的父函數(shù)a),所以結果就是彈出function a(){ b();};