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

首頁 > 網站 > WEB開發 > 正文

JavaScript中callee和caller的區別

2024-04-27 15:14:13
字體:
來源:轉載
供稿:網友

1.callee

  在函數的內部,有兩個特殊的對象:arguments和this。其中arguments是一個類似數組的對象,包含著傳入函數的所有參數。   雖然arguments的主要用途是保存函數參數,但這個對象有一個屬性——callee,該屬性是一個指針,指向擁有這個arguments對象的函數   所以callee的作用就是來指向當前對象 看一個階層函數的例子就會明白他的用途了:

/* * 普通的遞歸階層函數 */function factorial(num){ if(num <= 1){ return 1; }else{ return num * factorial(num-1); }}

  上面的代碼運行沒有問題,但這個函數的執行與函數名factorial緊緊耦合在一起了,要是改變了函數名,里面的函數名也要隨著改變,這樣很不方便,所以我們用arguments.callee來消除這種耦合。

//使用callee屬性的遞歸階層函數function factorial1(num){ if(num <= 1){ return 1; }else{ return num * arguments.callee(num-1); }}

  根據callee的定義,callee是arguments對象的一個屬性,指向擁有arguments對象的函數,這個函數就是factorial1 (factorial1=arguments.callee),他們指向的都是上面的遞歸函數。請記住函數的名字僅僅是一個包含指針的變量而已。

2.caller

  caller是函數對象的一個屬性,該屬性保存著調用當前函數的函數的引用(指向當前函數的直接父函數)

  返回一個對函數的引用,該函數調用了當前函數。

function a(){//父函數 b(); }; function b(){ console.info(b.caller); }; a(); //結果就是彈出函數a和內容

  可以看到函數b的屬性caller調用當前函數b的函數引用a(就是指向當前函數b的父函數a)

3.將callee和caller結合起來使用

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

  從這個代碼可以看出b函數中調用了b函數名,這樣當函數名改變時就很不方便,我們需要替換里面的那個b   前面我們知道用什么方法可以指向當前對象,下面我們就來修改一下:   

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

這里寫圖片描述

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

  如果一對兔子每月生一對兔子;一對新生兔,從第二個月起就開始生兔子;假定每對兔子都是一雌一雄,試問一對兔子,第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]; } }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 同德县| 习水县| 江达县| 阳西县| 岳西县| 江山市| 萨迦县| 个旧市| 达孜县| 图们市| 石门县| 庆云县| 罗田县| 从化市| 茌平县| 乌兰浩特市| 金华市| 布拖县| 靖江市| 元谋县| 呼伦贝尔市| 和硕县| 巩义市| 新野县| 措勤县| 玉林市| 南华县| 宕昌县| 丹巴县| 稻城县| 会昌县| 洪雅县| 浮梁县| 依兰县| 农安县| 绿春县| 威宁| 闵行区| 江陵县| 安庆市| 汤原县|