JavaScript arguments.callee作用及替换方案详解


Posted in Javascript onSeptember 02, 2020

一、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]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript调用XML制作连动下拉列表框
Jun 25 Javascript
使用jquery实现IE下按backspace相当于返回操作
Mar 18 Javascript
jquery实现Li滚动时滚动条自动添加样式的方法
Aug 10 Javascript
JS实现仿Windows经典风格的选项卡Tab切换代码
Oct 20 Javascript
页面get请求 中文参数方法乱码问题的快速解决方法
May 31 Javascript
给easyui的datebox控件添加清空按钮的实现方法
Nov 09 Javascript
jQuery 插件封装的方法
Nov 16 Javascript
微信小程序url与token设置详解
Sep 26 Javascript
简单谈谈vue的过渡动画(推荐)
Oct 11 Javascript
Vue官网todoMVC示例代码
Jan 29 Javascript
react中使用css的7中方式(最全总结)
Feb 11 Javascript
js时间转换毫秒的实例代码
Aug 21 Javascript
JavaScript Array.flat()函数用法解析
Sep 02 #Javascript
通过实例解析JavaScript常用排序算法
Sep 02 #Javascript
手把手教你实现 Promise的使用方法
Sep 02 #Javascript
如何基于jQuery实现五角星评分
Sep 02 #jQuery
在vscode 中设置 vue模板内容的方法
Sep 02 #Javascript
JavaScript array常用方法代码实例详解
Sep 02 #Javascript
Vue前端判断数据对象是否为空的实例
Sep 02 #Javascript
You might like
php下关于中英数字混排的字符串分割问题
2010/04/06 PHP
PHP中使用imagick生成PSD文件缩略图教程
2015/01/26 PHP
php快速查找数据库中恶意代码的方法
2015/04/01 PHP
laravel创建类似ThinPHP中functions.php的全局函数
2016/11/26 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
PHP+Session防止表单重复提交的解决方法
2018/04/09 PHP
javascript模拟select,jselect的方法实现
2012/11/08 Javascript
javascript类型转换示例
2014/04/29 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
Jquery和BigFileUpload实现大文件上传及进度条显示
2016/06/27 Javascript
JavaScript三种绑定事件方式及相互之间的区别分析
2017/01/10 Javascript
Vue开发过程中遇到的疑惑知识点总结
2017/01/20 Javascript
对node.js中render和send的用法详解
2018/05/14 Javascript
微信小程序实现倒计时调用相机自动拍照功能
2018/06/10 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
微信小程序 WXML节点信息查询详解
2019/07/29 Javascript
详解vue 组件
2020/06/11 Javascript
React冒泡和阻止冒泡的应用详解
2020/08/18 Javascript
Vue实现点击当前行变色
2020/12/14 Vue.js
python通过加号运算符操作列表的方法
2015/07/28 Python
Python3利用SMTP协议发送E-mail电子邮件的方法
2017/09/30 Python
利用python实现AR教程
2019/11/20 Python
python使用布隆过滤器的实现示例
2020/08/20 Python
Python中使用Selenium环境安装的方法步骤
2021/02/22 Python
学习十八届三中全会精神实施方案
2014/02/17 职场文书
初中生评语大全
2014/04/24 职场文书
贷款承诺书范文
2014/05/19 职场文书
光学与应用专业毕业生求职信
2014/09/01 职场文书
高校师德师风自我剖析材料
2014/09/29 职场文书
黄石寨导游词
2015/02/05 职场文书
2015年大学教师工作总结
2015/05/20 职场文书
爱心捐赠活动简讯
2015/07/20 职场文书
教师学习中国梦心得体会
2016/01/05 职场文书
JS ES6异步解决方案
2021/04/29 Javascript
Redis IP地址的绑定的实现
2021/05/08 Redis
用python删除文件夹中的重复图片(图片去重)
2021/05/12 Python