返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript中arguments.callee属性的作用与替换方案
  • 361
分享到

JavaScript中arguments.callee属性的作用与替换方案

2024-04-02 19:04:59 361人浏览 八月长安
摘要

arguments.callee的作用 在函数内部,有两个特殊的对象:arguments 和 this。其中, arguments 的主要用途是保存函数

arguments.callee的作用

在函数内部,有两个特殊的对象:arguments 和 this。其中, arguments 的主要用途是保存函数参数, 但这个对象还有一个名叫 callee 的属性,该属性是一个指针,指向拥有这个 arguments 对象的函数。 请看下面这个非常经典的阶乘函数

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 是个很昂贵的操作,因为它是个很大的对象,每次递归调用时都需要重新创建。影响现代浏览器的性能,还会影响闭包。

不能用怎么办?

像第三段中的例子,重写 factorial()方法导致trueFactorial()结果不在预期。是为了演示而做的。平时写代码应该避免。

递归时用到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 被弃用了。怎么办,其实很简单,给内部函数一个名字即可

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

到此这篇关于javascript中arguments.callee属性的作用与替换方案的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: JavaScript中arguments.callee属性的作用与替换方案

本文链接: https://lsjlt.com/news/152472.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JavaScript中arguments.callee属性的作用与替换方案
    arguments.callee的作用 在函数内部,有两个特殊的对象:arguments 和 this。其中, arguments 的主要用途是保存函数...
    99+
    2024-04-02
  • JavaScript中arguments.callee属性有哪些作用
    这篇文章主要讲解了“JavaScript中arguments.callee属性有哪些作用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript中arguments.callee属...
    99+
    2023-07-02
  • javascript 中动画制作方法 animate()属性
    animate是个非常冷门的方法,以至于百度和手册上都找不到相关的资料。当然通过一个小小的demo,我还是发现了方法的一些属 animate是所有dom元素都有的方法,可以用来最做过...
    99+
    2024-04-02
  • Pandas中Series的属性,方法,常用操作使用案例
    目录1. Series 对象的创建1.1 创建一个空的 Series 对象1.2 通过列表创建一个 Series 对象1.3 通过元组创建一个 Series 对象1.4 通过字典创建...
    99+
    2024-04-02
  • 替换json对象中的key最佳方案
    JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子...
    99+
    2024-04-02
  • JavaScript计算属性与监视(侦听)属性的使用
    监视属性(watch)watch监视(侦听)器允许开发者监视数据的变化,从而针对数据的变化做特定的操作。监视的两种方法通过new Vue时传入watch配置:<div id="root"> <i...
    99+
    2023-05-14
    javascript
  • 替换json对象中的key的解决方案
    本篇文章和大家了解一下替换json对象中的key的解决方案。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基...
    99+
    2023-06-15
  • Javascript length属性的作用是什么
    Javascript的length属性用于返回数组或字符串的长度。对于数组,length属性返回数组中元素的个数。例如:var ar...
    99+
    2023-10-23
    Javascript
  • JavaScript LN2属性的作用是什么
    JavaScript中的LN2属性代表自然对数2(即以e为底的对数)。该属性的值为一个介于1和2之间的常数,约为0.69314718...
    99+
    2023-10-12
    JavaScript
  • C++ 内联函数的局限性与替代方案
    c++++ 内联函数存在代码膨胀、优化受限和无法递归的局限性。替代方案包括:1) 宏,虽然提供代码优化但不具有函数作用域和类型安全;2) 模板特化,为特定参数类型提供特定实现;3) la...
    99+
    2024-04-17
    c++ 内联函数 作用域
  • Python Pycurl的属性与方法案例详解
    Pycurl包是一个libcurl的Python接口,由C语言编写的,功能强大,速度快。由于pycurl的属性和方法太多了,写这篇博文记录一下pycurl的属性和方法。 正常安装 p...
    99+
    2024-04-02
  • 详解Swift中属性的声明与作用
    一、引言 属性将值与类,结构体,枚举进行关联。Swift中的属性分为存储属性和计算属性两种,存储属性用于存储一个值,其只能用于类与结构体,计算属性用于计算一个值,其可以用于类,结构体和枚举。 二、存储属性 ...
    99+
    2022-06-04
    详解 属性 声明
  • JavaScript中有哪些常用的属性方法
    JavaScript中有哪些常用的属性方法?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。JavaScript常用属性方法有:document.write(&qu...
    99+
    2023-06-14
  • Python字符串的搜索与替换的操作方法
    这篇文章将为大家详细讲解有关Python字符串的搜索与替换的操作方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Python字符串中的搜索和替换:* S.find(substr,...
    99+
    2023-06-17
  • JavaScript 中替换字符串的方法有几种
    这篇文章主要介绍“JavaScript 中替换字符串的方法有几种”,在日常操作中,相信很多人在JavaScript 中替换字符串的方法有几种问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望...
    99+
    2024-04-02
  • Golang中的替换操作方法是什么
    本篇内容介绍了“Golang中的替换操作方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Golang的字符串动态变量Golang 的...
    99+
    2023-07-05
  • JavaScript String length属性的作用是什么
    JavaScript中的String length属性用于返回一个字符串的长度。它返回字符串中的字符数,包括空格和标点符号。该属性可...
    99+
    2023-10-12
    JavaScript
  • css属性中float属性的作用是什么
    本教程操作环境:Windows10系统、CSS3版、DELL G3电脑css属性中float属性的作用是什么?float,css的一种属性,主要属性值为:left(左浮动)、none(不浮动)、right(右浮动)、inherit(继承父元...
    99+
    2023-05-14
    float css
  • JavaScript中对象属性的简写方法
    这篇文章给大家分享的是有关JavaScript中对象属性的简写方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。对象属性简写如果属性名与key名相同,则可以采用ES6的方法:简写:感谢各位的阅读!关于“JavaS...
    99+
    2023-06-27
  • Redis中用scan替换keys的方法
    我们都知道查找 Redis 的键时,可以使用 keys pattern,但当 key 太多时,keys 命令的效率就很低,如果在线上直接使用,甚至可能发生生产事故,这时候,我们不妨使用 scan 命令。SC...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作