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基础知识之数据类型
Aug 06 Javascript
JavaScript中判断对象类型的几种方法总结
Nov 11 Javascript
Shell脚本实现Linux系统和进程资源监控
Mar 05 Javascript
js插件dropload上拉下滑加载数据实例解析
Jul 27 Javascript
微信小程序 Video API实例详解
Oct 02 Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
Nov 22 Javascript
小程序视频或音频自定义可拖拽进度条的示例代码
Sep 30 Javascript
Angularjs实现数组随机排序的方法
Oct 02 Javascript
微信小程序判断页面是否从其他页面返回的实例代码
Jul 03 Javascript
浅谈JS中this在各个场景下的指向
Aug 14 Javascript
JS轮播图的实现方法2
Aug 25 Javascript
JavaScript中Object、map、weakmap的区别分析
Dec 15 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中批量替换文件名的实现代码
2011/07/20 PHP
用Zend Studio+PHPnow+Zend Debugger搭建PHP服务器调试环境步骤
2014/01/19 PHP
php 魔术方法详解
2014/11/11 PHP
PHP与服务器文件系统的简单交互
2016/10/21 PHP
详解Yii2 定制表单输入字段的标签和样式
2017/01/04 PHP
php下载远程大文件(获取远程文件大小)的实例
2017/06/17 PHP
Yii框架日志记录Logging操作示例
2018/07/12 PHP
JavaScript 克隆数组最简单的方法
2009/02/12 Javascript
javascript arguments 传递给函数的隐含参数
2009/08/21 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
2013/11/27 Javascript
table行随鼠标移动变色示例
2014/05/07 Javascript
JavaScript中统计Textarea字数并提示还能输入的字符
2014/06/10 Javascript
jQuery取消ajax请求的方法
2015/06/09 Javascript
JavaScript和JQuery的鼠标mouse事件冒泡处理
2015/06/19 Javascript
jQuery Mobile动态刷新页面样式的实现方法
2016/05/28 Javascript
基于Vue2的移动端开发环境搭建详解
2016/11/03 Javascript
Ajax实现不刷新取最新商品
2017/03/01 Javascript
angularjs实现分页和搜索功能
2018/01/03 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
2018/12/24 Javascript
vue实现计步器功能
2019/11/01 Javascript
Python进程间通信用法实例
2015/06/04 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
2018/06/28 Python
远程部署工具Fabric详解(支持Python3)
2019/07/04 Python
Python 等分切分数据及规则命名的实例代码
2019/08/16 Python
django多种支付、并发订单处理实例代码
2019/12/13 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
python 录制系统声音的示例
2020/12/21 Python
年终奖发放方案
2014/06/02 职场文书
工作收入证明模板
2014/10/10 职场文书
2014小学语文教师个人工作总结
2014/12/03 职场文书
护理工作心得体会
2016/01/22 职场文书
Python+Appium新手教程
2021/04/17 Python
浅谈MySQL函数
2021/10/05 MySQL
Java 超详细讲解IO操作字节流与字符流
2022/03/25 Java/Android
angular4实现带搜索的下拉框
2022/03/25 Javascript
Django框架中模型的用法
2022/06/10 Python