js中callee與caller的區別


callee是對象的一個屬性,該屬性是一個指針,指向參數arguments對象的函數
首先我們來寫個階成函數:
function chen(x){
if (x<=1) {
return 1;
} else{
return x*chen(x-1);
};
};
從這個函數中可以看出來,用到了遞歸函數,要是改變了函數名,里面的函數名也要隨着改變,這樣很不方便所以我們用callee來試試
function chen(x){
if (x<=1) {return 1;
}else{
return x*arguments.callee(x-1);
};
};
我們來分析一下為什么這樣寫:根據callee的定義,可以看出來callee是arguments對象的一個屬性,指向arguments對象的函數,這個函數就是chen(chen=arguments.callee),這樣解釋應該可以理解了吧。

caller是函數對象的一個屬性,該屬性保存着調用當前函數的函數的引用(指向當前函數的直接父函數)
先來個例子吧
function a(){
b();
};
function b(){
alert(b.caller);
};
a(); //結果就是彈出函數a和內容

我們來解釋一下吧,首先函數b的屬性caller調用當前函數b的函數引用a(就是指向當前函數b的父函數a),所以結果就是彈出 function a(){ b();};

那么了解了caller和callee,那么可以不可以將二者結合在一起來使用呢
function b(){
alert(b.caller);
};
從這個代碼可以看出b函數中調用了b函數名,這樣當函數名改變時就很不方便,我們需要替換里面的那個b
前面我們知道用什么方法可以指向當前對象,下面我們就來修改一下:

(function a(){
b();
})();

function b(){
alert(arguments.callee.caller);
};
從代碼中可以看出我們用arguments.callee代替了b函數,所以解決了一下麻煩。。。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM