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 相关文章推荐
学习从实践开始之jQuery插件开发 对话框插件开发
Apr 26 Javascript
jquery 面包屑导航 具体实现
Jun 05 Javascript
jQuery filter函数使用方法
May 19 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
Feb 20 Javascript
javascript下拉列表中显示树形菜单的实现方法
Nov 17 Javascript
js简单设置与使用cookie的方法
Jan 22 Javascript
JS判断浏览器是否安装flash插件的简单方法
Sep 13 Javascript
浅谈Redux中间件的实践
Jul 27 Javascript
简述vue路由打开一个新的窗口的方法
Nov 29 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
Sep 27 Javascript
JavaScript实现串行请求的示例代码
Sep 14 Javascript
js实现滚动条自动滚动
Dec 13 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循环输出数据库内容的代码
2008/05/24 PHP
PHP的可变变量名的使用方法分享
2012/02/05 PHP
三个类概括PHP的五种设计模式
2012/09/05 PHP
PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题
2015/11/30 PHP
php简单复制文件的方法
2016/05/09 PHP
PHP多维数组元素操作类的方法
2016/11/14 PHP
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
使用laravel根据用户类型来显示或隐藏字段
2019/10/17 PHP
JS实现悬浮移动窗口(悬浮广告)的特效
2013/03/12 Javascript
js获取当前日期时间及其它操作汇总
2015/04/17 Javascript
js获取表格的行数和列数的方法
2015/10/23 Javascript
全面详细的jQuery常见开发技巧手册
2016/02/21 Javascript
tablesorter.js表格排序使用方法(支持中文排序)
2017/02/10 Javascript
vue中component组件的props使用详解
2017/09/04 Javascript
vue实现nav导航栏的方法
2017/12/13 Javascript
vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单
2018/09/14 Javascript
JavaScript内置对象之Array的使用小结
2020/05/12 Javascript
vue+AI智能机器人回复功能实现
2020/07/16 Javascript
[01:20]2018DOTA2亚洲邀请赛总决赛战队LGD晋级之路
2018/04/07 DOTA
Python实现识别图片内容的方法分析
2018/07/11 Python
Python 判断文件或目录是否存在的实例代码
2018/07/19 Python
解决安装pycharm后不能执行python脚本的问题
2019/01/19 Python
Python设计模式之简单工厂模式实例详解
2019/01/22 Python
在Python 中实现图片加框和加字的方法
2019/01/26 Python
Numpy 中的矩阵求逆实例
2019/08/26 Python
Python 简单计算要求形状面积的实例
2020/01/18 Python
基于Python中random.sample()的替代方案
2020/05/23 Python
Python子进程subpocess原理及用法解析
2020/07/16 Python
Levi’s美国官网:美国著名的牛仔裤品牌
2016/08/19 全球购物
世界领先的以旅馆为主的在线预订平台:Hostelworld
2016/10/09 全球购物
美国复古街头服饰精品店:Need Supply Co.
2017/02/22 全球购物
做人民满意的公务员活动方案
2014/08/25 职场文书
中国文明网向国旗敬礼活动精彩寄语2014
2014/09/27 职场文书
优秀班主任推荐材料
2014/12/17 职场文书
Python初学者必备的文件读写指南
2021/06/23 Python
Pycharm连接远程服务器并远程调试的全过程
2021/06/24 Python