中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JS中arguments.callee的用途有哪些

發布時間:2020-11-05 17:23:28 來源:億速云 閱讀:180 作者:Leah 欄目:開發技術

這篇文章運用簡單易懂的例子給大家介紹JS中arguments.callee的用途有哪些,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

一、arguments.callee的作用:返回正被執行的 Function 對象

   arguments 的主要用途是保存函數參數, 但這個對象還有一個名叫 callee 的屬性,返回正被執行的 Function 對象,也就是所指定的 Function 對象的正文,這有利于匿名函數的遞歸或者保證函數的封裝性。

   請看下面這個非常經典的階乘函數

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

定義階乘函數一般都要用到遞歸算法;如上面的代碼所示,在函數有名字,而且名字以后也不會變的情況下,這樣定義沒有問題。
但問題是這個函數的執行與函數名 factorial 緊緊耦合在了一起。為了消除這種緊密耦合的現象,可以像下面這樣使用

arguments.callee

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

在這個重寫后的 factorial()函數的函數體內,沒有再引用函數名 factorial。這樣,無論引用函數時使用的是什么名字,都可以保證正常完成遞歸調用。例如

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 的值,實際上是在另一個位置上保存了一個函數的指針。然后,我們又將一個簡單地返回 0的函數賦值給 factorial 變量。如果像原來的 factorial() 那樣不使用 arguments.callee,調用 trueFactorial()就會返回 0。可是,在解除了函數體內的代碼與函數名的耦合狀態之后,trueFactorial()仍然能夠正常地計算階乘;至于factorial(),它現在只是一個返回 0的函數。

二、arguments.callee的替換方案

現在已經不推薦使用arguments.callee();

原因:訪問 arguments 是個很昂貴的操作,因為它是個很大的對象,每次遞歸調用時都需要重新創建。影響現代瀏覽器的性能,還會影響閉包。

不能用怎么辦?

遞歸時用到arguments.callee()是常見的事情,比如一道面試題。接受參數n=5,不用for循環輸出數組【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]

現在arguments.callee 被棄用了。怎么辦,其實很簡單,給內部函數一個名字即可(當函數被調用時,它的arguments.callee對象就會指向自身,也就是一個對自己的引用。)

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]

關于JS中arguments.callee的用途有哪些就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

井研县| 西昌市| 瓦房店市| 咸丰县| 外汇| 喜德县| 鲁山县| 平潭县| 金华市| 凤山市| 社旗县| 鄂托克旗| 措勤县| 磐安县| 剑川县| 舒城县| 昌都县| 深州市| 广州市| 大渡口区| 滕州市| 玉林市| 白水县| 高雄县| 北票市| 承德县| 措美县| 蓬溪县| 全椒县| 周宁县| 石楼县| 武功县| 修文县| 启东市| 安塞县| 延津县| 化德县| 洛阳市| 甘德县| 青阳县| 江门市|