国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

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

2019-11-19 11:15:19
字體:
供稿:網(wǎng)友

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

1.callee

在函數(shù)的內(nèi)部,有兩個(gè)特殊的對象:arguments和this。其中arguments是一個(gè)類似數(shù)組的對象,包含著傳入函數(shù)的所有參數(shù)。

雖然arguments的主要用途是保存函數(shù)參數(shù),但這個(gè)對象有一個(gè)屬性――callee,該屬性是一個(gè)指針,指向擁有這個(gè)arguments對象的函數(shù)

所以callee的作用就是來指向當(dāng)前對象

看一個(gè)階層函數(shù)的例子就會明白他的用途了:

/* * 普通的遞歸階層函數(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對象的一個(gè)屬性,指向擁有arguments對象的函數(shù),這個(gè)函數(shù)就是factorial1 (factorial1=arguments.callee),他們指向的都是上面的遞歸函數(shù)。請記住函數(shù)的名字僅僅是一個(gè)包含指針的變量而已。

2.caller

caller是函數(shù)對象的一個(gè)屬性,該屬性保存著調(diào)用當(dāng)前函數(shù)的函數(shù)的引用(指向當(dāng)前函數(shù)的直接父函數(shù))

返回一個(gè)對函數(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)前對象,下面我們就來修改一下:

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

4.實(shí)例:斐波那契數(shù)列(用遞歸思想)

如果一對兔子每月生一對兔子;一對新生兔,從第二個(gè)月起就開始生兔子;假定每對兔子都是一雌一雄,試問一對兔子,第n個(gè)月能繁殖成多少對兔子?(使用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.VeVB.COm/code/HtmlJsRun測試上述代碼運(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é)

希望本文所述對大家JavaScript程序設(shè)計(jì)有所幫助。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 丹东市| 阿图什市| 收藏| 庄浪县| 宿州市| 榆林市| 互助| 刚察县| 平阴县| 武强县| 吴忠市| 黔西| 徐汇区| 阳西县| 镇沅| 江门市| 彭阳县| 汽车| 正宁县| 余姚市| 平舆县| 修水县| 巴林左旗| 虹口区| 张掖市| 漯河市| 阿合奇县| 黄梅县| 秀山| 三门峡市| 香港| 内丘县| 新昌县| 酒泉市| 临江市| 无锡市| 大兴区| 临高县| 宜阳县| 梅河口市| 微博|