JavaScript 中arguments.callee的代替用法

在函數(shù)內(nèi)部越驻,有兩個特殊的對象:argumentsthis宾娜。其中锉走, arguments 的主要用途是保存函數(shù)參數(shù), 但這個對象還有一個名叫 callee 的屬性术徊,該屬性是一個指針本刽,指向擁有這個 arguments 對象的函數(shù)。 請看下面這個非常經(jīng)典的階乘函數(shù):

function factorial(num){    
   if (num <=1) {         
      return 1;     
   } else {         
   return num * factorial(num-1)     
   } 
}

定義階乘函數(shù)一般都要用到遞歸算法赠涮;如上面的代碼所示子寓,在函數(shù)有名字,而且名字以后也不會變 的情況下笋除,這樣定義沒有問題斜友。但問題是這個函數(shù)的執(zhí)行與函數(shù)名 factorial 緊緊耦合在了一起。為 了消除這種緊密耦合的現(xiàn)象垃它,可以像下面這樣使用 arguments.callee

function factorial(num){    
   if (num <=1) {         
      return 1;     
   } else {         
   return num * arguments.callee(num-1);
   } 
}

在這個重寫后的 factorial()函數(shù)的函數(shù)體內(nèi)鲜屏,沒有再引用函數(shù)名 factorial。這樣嗤瞎,無論引用 函數(shù)時使用的是什么名字墙歪,都可以保證正常完成遞歸調(diào)用。例如:

function factorial(num){
            if(num <= 1){
                return 1;
            }else{
                return num * arguments.callee(num-1);
            }
        }
        var trueFactorial = factorial;
        alert(trueFactorial(5));    //120    
        factorial = function() {
            return 0;
        }                
        alert(trueFactorial(5));// 120 如果沒有使用arguments.callee贝奇,將返        回0

在此虹菲,變量 trueFactorial 獲得了factorial的值,實際上是在另一個位置上保存了一個函數(shù) 的指針掉瞳。然后毕源,我們又將一個簡單地返回 0的函數(shù)賦值給 factorial變量浪漠。如果像原來的 factorial() 那樣不使用 arguments.callee,調(diào)用 trueFactorial()就會返回 0霎褐≈吩福可是,在解除了函數(shù)體內(nèi)的代 碼與函數(shù)名的耦合狀態(tài)之后冻璃,trueFactorial()仍然能夠正常地計算階乘响谓;至于factorial(),它現(xiàn) 在只是一個返回 0的函數(shù)省艳。

現(xiàn)在已經(jīng)不推薦使用arguments.callee()娘纷;

原因:訪問 arguments 是個很昂貴的操作,因為它是個很大的對象跋炕,每次遞歸調(diào)用時都需要重新創(chuàng)建赖晶。影響現(xiàn)代瀏覽器的性能,還會影響閉包辐烂。

不能用怎么辦遏插?

像第三段中的例子,重寫 factorial()方法導(dǎo)致trueFactorial()結(jié)果不在預(yù)期纠修。是為了演示而做的胳嘲。平時寫代碼應(yīng)該避免。

遞歸時用到arguments.callee()是常見的事情分瘾,比如

一道面試題胎围。接受參數(shù)n=5,不用for循環(huán)輸出數(shù)組【1,2,3,4,5】

這用遞歸的思路,配合arguments.callee德召,代碼如下:

function show(n) {
    var arr = [];
    return (function () {
        arr.unshift(n);
        n--;
        if (n != 0) {
            arguments.callee();
        }
        return arr;
    })()
}
show(5)//[1,2,3,4,5]

現(xiàn)在arguments.callee被棄用了白魂。怎么辦,其實很簡單上岗,給內(nèi)部函數(shù)一個名字即可:

function show(n) {
    var arr = [];
     return (function fn() {
        arr.unshift(n);
        n--;
        if (n != 0) {
            fn();
        }
        return arr;
    })()
}
show(5)//[1,2,3,4,5]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末福荸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子肴掷,更是在濱河造成了極大的恐慌敬锐,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呆瞻,死亡現(xiàn)場離奇詭異台夺,居然都是意外死亡,警方通過查閱死者的電腦和手機痴脾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門颤介,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事滚朵≡┰郑” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵辕近,是天一觀的道長韵吨。 經(jīng)常有香客問我,道長移宅,這世上最難降的妖魔是什么归粉? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮吞杭,結(jié)果婚禮上盏浇,老公的妹妹穿的比我還像新娘。我一直安慰自己芽狗,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布痒蓬。 她就那樣靜靜地躺著童擎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪攻晒。 梳的紋絲不亂的頭發(fā)上顾复,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音鲁捏,去河邊找鬼芯砸。 笑死,一個胖子當(dāng)著我的面吹牛给梅,可吹牛的內(nèi)容都是我干的假丧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼动羽,長吁一口氣:“原來是場噩夢啊……” “哼包帚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起运吓,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤渴邦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拘哨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谋梭,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年倦青,在試婚紗的時候發(fā)現(xiàn)自己被綠了瓮床。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖纤垂,靈堂內(nèi)的尸體忽然破棺而出矾策,到底是詐尸還是另有隱情,我是刑警寧澤峭沦,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布贾虽,位于F島的核電站,受9級特大地震影響吼鱼,放射性物質(zhì)發(fā)生泄漏蓬豁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一菇肃、第九天 我趴在偏房一處隱蔽的房頂上張望地粪。 院中可真熱鬧,春花似錦琐谤、人聲如沸蟆技。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽质礼。三九已至,卻和暖如春织阳,著一層夾襖步出監(jiān)牢的瞬間眶蕉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工唧躲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留造挽,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓弄痹,卻偏偏與公主長得像饭入,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子界酒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容