JavaScript中callee和caller的區(qū)別與用法實例分析
本文實例講述了JavaScript中callee和caller的區(qū)別與用法。分享給大家供大家參考,具體如下:
1.callee
在函數(shù)的內部,有兩個特殊的對象:arguments和this。其中arguments是一個類似數(shù)組的對象,包含著傳入函數(shù)的所有參數(shù)。
雖然arguments的主要用途是保存函數(shù)參數(shù),但這個對象有一個屬性——callee,該屬性是一個指針,指向擁有這個arguments對象的函數(shù)
所以callee的作用就是來指向當前對象
看一個階層函數(shù)的例子就會明白他的用途了:
/* * 普通的遞歸階層函數(shù) */ function factorial(num){ if(num <= 1){ return 1; }else{ return num *factorial(num-1); } }
上面的代碼運行沒有問題,但這個函數(shù)的執(zhí)行與函數(shù)名factorial緊緊耦合在一起了,要是改變了函數(shù)名,里面的函數(shù)名也要隨著改變,這樣很不方便,所以我們用arguments.callee
來消除這種耦合。
//使用callee屬性的遞歸階層函數(shù) function factorial1(num){ if(num <= 1){ return 1; }else{ return num * arguments.callee(num-1); } }
根據(jù)callee的定義,callee是arguments對象的一個屬性,指向擁有arguments對象的函數(shù),這個函數(shù)就是factorial1 (factorial1=arguments.callee),他們指向的都是上面的遞歸函數(shù)。請記住函數(shù)的名字僅僅是一個包含指針的變量而已。
2.caller
caller是函數(shù)對象的一個屬性,該屬性保存著調用當前函數(shù)的函數(shù)的引用(指向當前函數(shù)的直接父函數(shù))
返回一個對函數(shù)的引用,該函數(shù)調用了當前函數(shù)。
function a(){//父函數(shù) b(); }; function b(){ console.info(b.caller); }; a(); //結果就是彈出函數(shù)a和內容
可以看到函數(shù)b的屬性caller調用當前函數(shù)b的函數(shù)引用a(就是指向當前函數(shù)b的父函數(shù)a)
3.將callee和caller結合起來使用
function b(){ alert(b.caller); };
從這個代碼可以看出b函數(shù)中調用了b函數(shù)名,這樣當函數(shù)名改變時就很不方便,我們需要替換里面的那個b
前面我們知道用什么方法可以指向當前對象,下面我們就來修改一下:
(function a(){ b(); })(); function b(){ alert(arguments.callee.caller);//用arguments.callee代替了b };
4.實例:斐波那契數(shù)列(用遞歸思想)
如果一對兔子每月生一對兔子;一對新生兔,從第二個月起就開始生兔子;假定每對兔子都是一雌一雄,試問一對兔子,第n個月能繁殖成多少對兔子?(使用callee完成)
var result=[]; function fn(n){ if(n==1){ return 1; }else if(n==2){ return 1; }else { if(result[n]){ return result[n]; }else{ //arguments.callee(...)=fn(...) result[n]=arguments.callee(n-1)+arguments.callee(n-2); return result[n]; } } }
感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。
更多關于JavaScript相關內容可查看本站專題:《JavaScript常用函數(shù)技巧匯總》、《javascript面向對象入門教程》、《JavaScript查找算法技巧總結》、《JavaScript錯誤與調試技巧總結》、《JavaScript數(shù)據(jù)結構與算法技巧總結》及《JavaScript數(shù)學運算用法總結》
希望本文所述對大家JavaScript程序設計有所幫助。
- js的隱含參數(shù)(arguments,callee,caller)使用方法
- javascript中callee與caller的用法和應用場景
- js apply/call/caller/callee/bind使用方法與區(qū)別分析
- javascript下arguments,caller,callee,call,apply示例及理解
- javascript中callee與caller的區(qū)別分析
- js中arguments,caller,callee,apply的用法小結
- 理解Javascript的caller,callee,call,apply區(qū)別
- Javascript - 全面理解 caller,callee,call,apply
- js arguments,jcallee caller用法總結
- javascript中caller和callee詳解
- js中的caller和callee屬性介紹和例子
相關文章
Javascript 網頁水印(非圖片水印)實現(xiàn)代碼
在一些B/S結構的應用系統(tǒng)中,有很多頁面是需要有水印的。常見的就是公文系統(tǒng)、合同系統(tǒng)等。2010-03-03