JavaScript中callee和caller的區(qū)別與用法實(shí)例分析
本文實(shí)例講述了JavaScript中callee和caller的區(qū)別與用法。分享給大家供大家參考,具體如下:
1.callee
在函數(shù)的內(nèi)部,有兩個(gè)特殊的對(duì)象:arguments和this。其中arguments是一個(gè)類似數(shù)組的對(duì)象,包含著傳入函數(shù)的所有參數(shù)。
雖然arguments的主要用途是保存函數(shù)參數(shù),但這個(gè)對(duì)象有一個(gè)屬性——callee,該屬性是一個(gè)指針,指向擁有這個(gè)arguments對(duì)象的函數(shù)
所以callee的作用就是來(lái)指向當(dāng)前對(duì)象
看一個(gè)階層函數(shù)的例子就會(huì)明白他的用途了:
/*
* 普通的遞歸階層函數(shù)
*/
function factorial(num){
if(num <= 1){
return 1;
}else{
return num *factorial(num-1);
}
}
上面的代碼運(yùn)行沒有問題,但這個(gè)函數(shù)的執(zhí)行與函數(shù)名factorial緊緊耦合在一起了,要是改變了函數(shù)名,里面的函數(shù)名也要隨著改變,這樣很不方便,所以我們用arguments.callee來(lái)消除這種耦合。
//使用callee屬性的遞歸階層函數(shù)
function factorial1(num){
if(num <= 1){
return 1;
}else{
return num * arguments.callee(num-1);
}
}
根據(jù)callee的定義,callee是arguments對(duì)象的一個(gè)屬性,指向擁有arguments對(duì)象的函數(shù),這個(gè)函數(shù)就是factorial1 (factorial1=arguments.callee),他們指向的都是上面的遞歸函數(shù)。請(qǐng)記住函數(shù)的名字僅僅是一個(gè)包含指針的變量而已。
2.caller
caller是函數(shù)對(duì)象的一個(gè)屬性,該屬性保存著調(diào)用當(dāng)前函數(shù)的函數(shù)的引用(指向當(dāng)前函數(shù)的直接父函數(shù))
返回一個(gè)對(duì)函數(shù)的引用,該函數(shù)調(diào)用了當(dāng)前函數(shù)。
function a(){//父函數(shù)
b();
};
function b(){
console.info(b.caller);
};
a(); //結(jié)果就是彈出函數(shù)a和內(nèi)容
可以看到函數(shù)b的屬性caller調(diào)用當(dāng)前函數(shù)b的函數(shù)引用a(就是指向當(dāng)前函數(shù)b的父函數(shù)a)
3.將callee和caller結(jié)合起來(lái)使用
function b(){
alert(b.caller);
};
從這個(gè)代碼可以看出b函數(shù)中調(diào)用了b函數(shù)名,這樣當(dāng)函數(shù)名改變時(shí)就很不方便,我們需要替換里面的那個(gè)b
前面我們知道用什么方法可以指向當(dāng)前對(duì)象,下面我們就來(lái)修改一下:
(function a(){
b();
})();
function b(){
alert(arguments.callee.caller);//用arguments.callee代替了b
};

4.實(shí)例:斐波那契數(shù)列(用遞歸思想)
如果一對(duì)兔子每月生一對(duì)兔子;一對(duì)新生兔,從第二個(gè)月起就開始生兔子;假定每對(duì)兔子都是一雌一雄,試問一對(duì)兔子,第n個(gè)月能繁殖成多少對(duì)兔子?(使用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代碼運(yùn)行工具:http://tools.jb51.net/code/HtmlJsRun測(cè)試上述代碼運(yùn)行效果。
更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專題:《JavaScript常用函數(shù)技巧匯總》、《javascript面向?qū)ο笕腴T教程》、《JavaScript查找算法技巧總結(jié)》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
- js的隱含參數(shù)(arguments,callee,caller)使用方法
- javascript中callee與caller的用法和應(yīng)用場(chǎng)景
- js apply/call/caller/callee/bind使用方法與區(qū)別分析
- javascript下arguments,caller,callee,call,apply示例及理解
- javascript中callee與caller的區(qū)別分析
- js中arguments,caller,callee,apply的用法小結(jié)
- 理解Javascript的caller,callee,call,apply區(qū)別
- Javascript - 全面理解 caller,callee,call,apply
- js arguments,jcallee caller用法總結(jié)
- javascript中caller和callee詳解
- js中的caller和callee屬性介紹和例子
相關(guān)文章
uni-app自定義導(dǎo)航欄右側(cè)做增加按鈕并跳轉(zhuǎn)鏈接功能
這篇文章主要介紹了uni-app自定義導(dǎo)航欄右側(cè)做增加按鈕并跳轉(zhuǎn)鏈接,本文通過實(shí)例代碼給大家分享實(shí)現(xiàn)思路,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
結(jié)合?ES6?類編寫JavaScript?創(chuàng)建型模式
這篇文章主要介紹了結(jié)合ES6類編寫JavaScript創(chuàng)建型模式,本文開始系統(tǒng)性的對(duì)20多種JavaScript?設(shè)計(jì)模式進(jìn)行簡(jiǎn)單概述,然后結(jié)合ES6類的方式來(lái)編寫實(shí)例代碼展示其使用方式,需要的朋友可以參考一下2022-07-07
textarea 控制輸入字符字節(jié)數(shù)(示例代碼)
本篇文章主要是對(duì)textarea 控制輸入字符字節(jié)數(shù)的示例代碼進(jìn)行了介紹,需要的朋友可以過來(lái)參考下,希望對(duì)大家有所幫助2013-12-12
JS中ESModule和commonjs介紹及使用區(qū)別
這篇文章主要介紹了JS中ESModule和commonjs介紹及使用區(qū)別,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-07-07
javascript insertAfter()定義與用法示例
這篇文章主要介紹了javascript insertAfter()定義與用法,實(shí)例分析了javascript節(jié)點(diǎn)后插入元素的實(shí)現(xiàn)與使用方法,需要的朋友可以參考下2016-07-07
es6學(xué)習(xí)筆記之Async函數(shù)基本教程
這篇文章主要給大家介紹了關(guān)于es6中Async函數(shù)的基本教程,文中介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)async函數(shù)具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-05-05

