欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript中arguments.callee屬性的作用與替換方案

 更新時(shí)間:2022年06月24日 09:44:20   作者:小旭2021  
這篇文章介紹了JavaScript中arguments.callee屬性的作用與替換方案,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

arguments.callee的作用

在函數(shù)內(nèi)部,有兩個(gè)特殊的對(duì)象:arguments 和 this。其中, arguments 的主要用途是保存函數(shù)參數(shù), 但這個(gè)對(duì)象還有一個(gè)名叫 callee 的屬性,該屬性是一個(gè)指針,指向擁有這個(gè) arguments 對(duì)象的函數(shù)。 請(qǐng)看下面這個(gè)非常經(jīng)典的階乘函數(shù)

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

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

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

在這個(gè)重寫后的 factorial()函數(shù)的函數(shù)體內(nèi),沒(méi)有再引用函數(shù)名 factorial。這樣,無(wú)論引用 函數(shù)時(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 如果沒(méi)有使用arguments.callee,將返回0

在此,變量 trueFactorial 獲得了 factorial 的值,實(shí)際上是在另一個(gè)位置上保存了一個(gè)函數(shù) 的指針。然后,我們又將一個(gè)簡(jiǎn)單地返回 0的函數(shù)賦值給 factorial 變量。如果像原來(lái)的 factorial() 那樣不使用 arguments.callee,調(diào)用 trueFactorial()就會(huì)返回 0??墒牵诮獬撕瘮?shù)體內(nèi)的代 碼與函數(shù)名的耦合狀態(tài)之后,trueFactorial()仍然能夠正常地計(jì)算階乘;至于 factorial(),它現(xiàn) 在只是一個(gè)返回 0的函數(shù)。

arguments.callee的替換方案

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

原因:訪問(wèn) arguments 是個(gè)很昂貴的操作,因?yàn)樗莻€(gè)很大的對(duì)象,每次遞歸調(diào)用時(shí)都需要重新創(chuàng)建。影響現(xiàn)代瀏覽器的性能,還會(huì)影響閉包。

不能用怎么辦?

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

遞歸時(shí)用到arguments.callee()是常見(jiàn)的事情,比如

一道面試題。接受參數(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 被棄用了。怎么辦,其實(shí)很簡(jiǎn)單,給內(nèi)部函數(shù)一個(gè)名字即可

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]

斐波那契遞歸算法替換

function factorial(num) {
      if (num <= 1) {
        return 1
      }
      var fac = 1
      return (function fn() {
        fac *= num
        num--
        if (num != 0) {
          fn()
        }
        return fac
      })()
    }
    factorial(5) // 120

到此這篇關(guān)于JavaScript中arguments.callee屬性的作用與替換方案的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JavaScript實(shí)現(xiàn)圖片局部放大鏡交互功能

    JavaScript實(shí)現(xiàn)圖片局部放大鏡交互功能

    在網(wǎng)頁(yè)設(shè)計(jì)和開發(fā)中,圖片局部放大鏡交互功能是一個(gè)常見(jiàn)的需求,它可以增強(qiáng)用戶體驗(yàn),讓用戶更仔細(xì)地查看圖片的細(xì)節(jié),本文將介紹如何使用JavaScript來(lái)實(shí)現(xiàn)這一功能,以及提供代碼示例和詳細(xì)解釋,需要的朋友可以參考下
    2023-10-10
  • 中文字符串截取的js函數(shù)代碼

    中文字符串截取的js函數(shù)代碼

    有時(shí)在顯示某段文字的時(shí)候,可能會(huì)太長(zhǎng),影響我們頁(yè)面的顯示效果。如果僅是英文,那么我們可以用String.substring(start, end)函數(shù)就已經(jīng)夠用了。但是通常我們都會(huì)遇到既有英文,又有漢字的情況。而漢字是占用2個(gè)字節(jié)的,如果用String.substring(start, end)截取字符串的話,會(huì)發(fā)現(xiàn)漢字截取后比英文截取后個(gè)數(shù)雖然相同,但是長(zhǎng)度還是長(zhǎng)出去不少(具體要視字符個(gè)數(shù)來(lái)決定)
    2013-04-04
  • Javascript實(shí)現(xiàn)找不同色塊的游戲

    Javascript實(shí)現(xiàn)找不同色塊的游戲

    先給大家說(shuō)下游戲規(guī)則:在變化數(shù)量的顏色塊里找出一個(gè)不同顏色的塊點(diǎn)擊。下面通過(guò)js代碼給大家分享找不同色塊的游戲?qū)崿F(xiàn)方法,需要的朋友參考下吧
    2017-07-07
  • 一個(gè)非常好用的文字滾動(dòng)的案例,鼠標(biāo)懸浮可暫停[兩種方案任選]

    一個(gè)非常好用的文字滾動(dòng)的案例,鼠標(biāo)懸浮可暫停[兩種方案任選]

    本文主要介紹了非常好用的文字滾動(dòng)的案例,鼠標(biāo)懸浮可暫停的兩種實(shí)現(xiàn)方案,代碼簡(jiǎn)潔,可收藏備用。需要的朋友來(lái)看下吧
    2016-12-12
  • JavaScript 數(shù)組常見(jiàn)操作技巧 (二)

    JavaScript 數(shù)組常見(jiàn)操作技巧 (二)

    這篇文章主要介紹了JavaScript 數(shù)組常見(jiàn)操作技巧,上一篇文章已經(jīng)給大家分享了(一),下面緊接上一篇文章分享下面技巧,需要的小伙伴可以參考一下
    2022-02-02
  • Javascript限制網(wǎng)頁(yè)只能在微信內(nèi)置瀏覽器中訪問(wèn)

    Javascript限制網(wǎng)頁(yè)只能在微信內(nèi)置瀏覽器中訪問(wèn)

    最近正在開發(fā)一個(gè)微信公眾賬號(hào),其中有一項(xiàng)功能是用戶發(fā)送文字消息給公眾號(hào),然后公眾號(hào)返回圖文消息給用戶,用戶再點(diǎn)擊圖文消息即可跳轉(zhuǎn)到一個(gè)網(wǎng)頁(yè)鏈接,在微信的內(nèi)置瀏覽器中打開。
    2014-11-11
  • 完美實(shí)現(xiàn)js拖拽效果 return false用法詳解

    完美實(shí)現(xiàn)js拖拽效果 return false用法詳解

    這篇文章主要為大家詳細(xì)介紹了完美實(shí)現(xiàn)js拖拽效果的代碼,一起學(xué)習(xí)return false的用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • IE的有條件注釋判定IE版本詳解(附實(shí)例代碼)

    IE的有條件注釋判定IE版本詳解(附實(shí)例代碼)

    IE的有條件注釋是一種專有的(因此是非標(biāo)準(zhǔn)的)、對(duì)常規(guī)(X)HTML注釋的Miscrosoft擴(kuò)展。顧名思義,有條件注釋使你能夠根據(jù)條件(比如瀏覽器版本)顯示代碼塊(不一定就是css,也可以是html代碼,甚至是JavaScript代碼)。
    2012-01-01
  • js鼠標(biāo)滑過(guò)彈出層的定位IE6bug解決辦法

    js鼠標(biāo)滑過(guò)彈出層的定位IE6bug解決辦法

    大家在寫div+css的時(shí)候經(jīng)常會(huì)用到彈出層,由于IE6的bug,所以當(dāng)使用多個(gè)標(biāo)簽重復(fù)寫彈出層的時(shí)候會(huì)遇到后面的層壓在了彈出層的上面;用Jquery給彈出層的z軸依次增加高度可解決.代碼很簡(jiǎn)單,效果很顯著,需要了解的朋友可以參考下
    2012-12-12
  • JS代碼觸發(fā)事件代碼實(shí)例

    JS代碼觸發(fā)事件代碼實(shí)例

    這篇文章主要介紹了js代碼觸發(fā)事件代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01

最新評(píng)論