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 相关文章推荐
treepanel动态加载数据实现代码
Dec 15 Javascript
javascript重写alert方法的实例代码
Mar 29 Javascript
jquery ready(fn)事件使用介绍
Aug 21 Javascript
JavaScript创建对象的写法
Aug 29 Javascript
javascript操作excel生成报表示例
May 08 Javascript
js统计录入文本框中字符的个数并加以限制不超过多少
May 23 Javascript
获取JavaScript异步函数的返回值
Dec 21 Javascript
基于jquery实现多选下拉列表
Aug 02 jQuery
AngularJS实现的简单拖拽功能示例
Jan 02 Javascript
JS实现数组的增删改查操作示例
Aug 29 Javascript
多个vue子路由文件自动化合并的方法
Sep 03 Javascript
JS前端使用canvas实现扩展物体类和事件派发
Aug 05 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 小乘法表实现代码
2009/07/16 PHP
php中时间轴开发(刚刚、5分钟前、昨天10:23等)
2011/10/03 PHP
PHP中基本HTTP认证技巧分析
2015/03/16 PHP
php结合正则批量抓取网页中邮箱地址
2015/05/19 PHP
又拍云异步上传实例教程详解
2016/04/19 PHP
PHP中子类重载父类的方法【parent::方法名】
2016/05/06 PHP
thinkphp5.1 框架钩子和行为用法实例分析
2020/05/25 PHP
深入理解Javascript作用域与变量提升
2013/12/09 Javascript
Javascript中神奇的this
2016/01/20 Javascript
Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)
2016/07/14 Javascript
JavaScript省市区三级联动菜单效果
2016/09/21 Javascript
详解javascript表单的Ajax提交插件的使用
2016/12/29 Javascript
nodejs入门教程四:URL相关模块用法分析
2017/04/24 NodeJs
Javascript循环删除数组中元素的几种方法示例
2017/05/18 Javascript
完美实现js拖拽效果 return false用法详解
2017/07/28 Javascript
AngularJS中table表格基本操作示例
2017/10/10 Javascript
解决jquery的ajax调取后端数据成功却渲染失败的问题
2018/08/08 jQuery
使用Vue中 v-for循环列表控制按钮隐藏显示功能
2019/04/23 Javascript
jQuery控制input只能输入数字和两位小数的方法
2019/05/16 jQuery
JS实现购物车基本功能
2020/11/08 Javascript
Django中更新多个对象数据与删除对象的方法
2015/07/17 Python
python实现画圆功能
2018/01/25 Python
Numpy中转置transpose、T和swapaxes的实例讲解
2018/04/17 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
2019/07/28 Python
python 删除excel表格重复行,数据预处理操作
2020/07/06 Python
python基于pygame实现飞机大作战小游戏
2020/11/19 Python
使用css3做0.5px的细线的示例代码
2018/01/18 HTML / CSS
html5实现移动端适配完美写法
2017/11/16 HTML / CSS
写好自荐信的要点
2013/11/06 职场文书
机械设计职业生涯规划书
2013/12/27 职场文书
策划总监岗位职责
2014/02/16 职场文书
促销活动方案模板
2014/02/24 职场文书
2014年高中生自我评价范文
2014/09/26 职场文书
党的群众路线学习笔记
2014/11/06 职场文书
2015年小学总务工作总结
2015/07/21 职场文书
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
2022/04/11 Vue.js