JavaScript中callee和caller的區(qū)別與用法實(shí)例分析

本文實(shí)例講述了JavaScript中callee和caller的區(qū)別與用法。分享給大家供大家參考,具體如下:

為新和等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及新和網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、新和網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

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的作用就是來指向當(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來消除這種耦合。

//使用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é)合起來使用

function b(){
  alert(b.caller);
};

從這個(gè)代碼可以看出b函數(shù)中調(diào)用了b函數(shù)名,這樣當(dāng)函數(shù)名改變時(shí)就很不方便,我們需要替換里面的那個(gè)b

前面我們知道用什么方法可以指向當(dāng)前對(duì)象,下面我們就來修改一下:

(function a(){
  b();
})();
function b(){
  alert(arguments.callee.caller);//用arguments.callee代替了b
};

JavaScript中callee和caller的區(qū)別與用法實(shí)例分析

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ì)有所幫助。

網(wǎng)頁名稱:JavaScript中callee和caller的區(qū)別與用法實(shí)例分析
地址分享:http://muchs.cn/article20/jehoco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)品牌網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航網(wǎng)站維護(hù)、Google虛擬主機(jī)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)