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 相关文章推荐
用window.location.href实现刷新另个框架页面
Mar 07 Javascript
XmlUtils JS操作XML工具类
Oct 01 Javascript
JS 实现导航栏悬停效果(续2)
Sep 24 Javascript
jquery ajax跨域解决方法(json方式)
Feb 04 Javascript
JS判断字符串长度的5个方法(区分中文和英文)
Mar 18 Javascript
使用vue.js开发时一些注意事项
Apr 27 Javascript
JS获取字符对应的ASCII码实例
Sep 10 Javascript
详解nuxt路由鉴权(express模板)
Nov 21 Javascript
js中数组对象去重的两种方法
Jan 18 Javascript
浅谈Javascript常用正则表达式应用
Mar 08 Javascript
浅谈js闭包理解
Apr 01 Javascript
Vue 实现v-for循环的时候更改 class的样式名称
Jul 17 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中使用灵巧的体系结构
2006/10/09 PHP
ajax缓存问题解决途径
2006/12/06 PHP
PHP文件上传小程序 适合初学者学习!
2019/05/23 PHP
清华大学出版的事半功倍系列 javascript全部源代码
2007/05/04 Javascript
一个js拖拽的效果类和dom-drag.js浅析
2010/07/17 Javascript
silverlight线程与基于事件驱动javascript引擎(实现轨迹回放功能)
2011/08/09 Javascript
使用jQuery快速解决input中placeholder值在ie中无法支持的问题
2014/01/02 Javascript
Nginx上传文件全部缓存解决方案
2015/08/17 Javascript
jQuery+css实现的换页标签栏效果
2016/01/27 Javascript
微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
2016/12/02 Javascript
Vue实现动态显示textarea剩余字数
2017/05/22 Javascript
Angular4.x Event (DOM事件和自定义事件详解)
2018/10/09 Javascript
js验证身份证号码记录的方法
2019/04/26 Javascript
基于vue实现圆形菜单栏组件
2019/07/05 Javascript
jQuery使用ajax传递json对象到服务端及contentType的用法示例
2020/03/12 jQuery
vue实现简单加法计算器
2020/10/22 Javascript
在Vue中使用Select选择器拼接label的操作
2020/10/22 Javascript
Python批量创建迅雷任务及创建多个文件
2016/02/13 Python
python实现可以断点续传和并发的ftp程序
2016/09/13 Python
python数据处理 根据颜色对图片进行分类的方法
2018/12/08 Python
python爬取cnvd漏洞库信息的实例
2019/02/14 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
2020/01/19 Python
python读取文件指定行内容实例讲解
2020/03/02 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
2020/06/28 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
2020/07/15 Python
Python判断字符串是否为合法标示符操作
2020/09/03 Python
python的链表基础知识点
2020/09/13 Python
Omio俄罗斯:一次搜索公共汽车、火车和飞机的机票
2018/11/17 全球购物
简历的自我评价范文
2014/02/04 职场文书
2014年社区国庆节活动方案
2014/09/16 职场文书
社区综治工作汇报
2014/10/27 职场文书
党员个人年度总结
2015/02/14 职场文书
异地恋情人节寄语
2015/02/28 职场文书
工作简报范文
2015/07/21 职场文书
2016十一国庆节慰问信
2015/12/01 职场文书
MySQL事务操作的四大特性以及并发事务问题
2022/04/12 MySQL