最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript arguments.callee作用及替換方案詳解

 更新時間:2020年09月02日 11:08:12   作者:vickylinj  
這篇文章主要介紹了JavaScript arguments.callee作用及替換方案詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

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

   arguments 的主要用途是保存函數(shù)參數(shù), 但這個對象還有一個名叫 callee 的屬性,返回正被執(zhí)行的 Function 對象,也就是所指定的 Function 對象的正文,這有利于匿名函數(shù)的遞歸或者保證函數(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ù)。

二、arguments.callee的替換方案

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

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

不能用怎么辦?

遞歸時用到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ù)一個名字即可(當(dāng)函數(shù)被調(diào)用時,它的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]

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JavaScript中的作用域與閉包、原型與原型鏈、異步與單線程

    JavaScript中的作用域與閉包、原型與原型鏈、異步與單線程

    JavaScript的三座大山指的是:作用域和閉包、原型和原型鏈、異步與單線程,這些概念在日常的開發(fā)工作中經(jīng)常被提及,并對我們理解和編寫高質(zhì)量的JavaScript代碼至關(guān)重要
    2024-02-02
  • uniapp自定義多列瀑布流組件項目實戰(zhàn)總結(jié)

    uniapp自定義多列瀑布流組件項目實戰(zhàn)總結(jié)

    這篇文章主要為大家介紹了uniapp自定義多列瀑布流組件實戰(zhàn)總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • js實現(xiàn)透明度漸變效果的方法

    js實現(xiàn)透明度漸變效果的方法

    這篇文章主要介紹了js實現(xiàn)透明度漸變效果的方法,涉及javascript實現(xiàn)漸變效果的技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • 基于Bootstrap框架菜鳥入門教程(推薦)

    基于Bootstrap框架菜鳥入門教程(推薦)

    下面小編就為大家?guī)硪黄贐ootstrap框架菜鳥入門教程(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Bootstrap Table使用整理(一)

    Bootstrap Table使用整理(一)

    基于 Bootstrap 的 jQuery 表格插件,通過簡單的設(shè)置,就可以擁有強大的單選、多選、排序、分頁,以及編輯、導(dǎo)出、過濾(擴展)等等的功能
    2017-06-06
  • js打開新窗口方法整理

    js打開新窗口方法整理

    js打開新窗口的方法有很多,本文大致整理了一些,需要的朋友可以參考下
    2014-02-02
  • 詳解TypeScript2.0標記聯(lián)合類型

    詳解TypeScript2.0標記聯(lián)合類型

    這篇文章主要介紹了TypeScript2.0標記聯(lián)合類型,對TS感興趣的同學(xué),可以參考下
    2021-05-05
  • 分享JavaScript?中的幾種繼承方式

    分享JavaScript?中的幾種繼承方式

    這篇文章主要介紹了分享JavaScript?中的幾種繼承方式,JavaScript中的繼承主要是通過原型鏈實現(xiàn)的,具體實現(xiàn)需要的小伙伴可以參考下面文章詳細內(nèi)容
    2022-05-05
  • 使用Vite從零搭建前端項目的詳細過程

    使用Vite從零搭建前端項目的詳細過程

    這篇文章主要介紹了使用Vite從零搭建前端項目的詳細過程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • JavaScript ES6中CLASS的使用詳解

    JavaScript ES6中CLASS的使用詳解

    class是es6引入的最重要特性之一。在沒有class之前,我們只能通過原型鏈來模擬類。這篇文章我們將詳細的介紹關(guān)于ES6中CLASS的使用,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-11-11

最新評論

容城县| 巴林左旗| 松滋市| 三穗县| 万荣县| 犍为县| 改则县| 牡丹江市| 建阳市| 安仁县| 城步| 通辽市| 科技| 乐昌市| 通城县| 昌都县| 德阳市| 广丰县| 和顺县| 根河市| 潼南县| 上犹县| 海兴县| 镇沅| 雷波县| 长武县| 高密市| 阿尔山市| 南丰县| 日喀则市| 齐河县| 望都县| 修武县| 博客| 东海县| 霍州市| 安仁县| 县级市| 广平县| 鹤峰县| 惠来县|