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 16 Javascript
根据json字符串生成Html的一种方式
Jan 09 Javascript
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
Apr 07 Javascript
JS延时提示框实现方法详解
Nov 26 Javascript
node.js require() 源码解读
Dec 13 Javascript
全面了解javascript中的错误处理机制
Jul 18 Javascript
arcgis for js 修改infowindow样式的方法
Nov 02 Javascript
vue2.0+webpack环境的构造过程
Nov 08 Javascript
vue中的非父子间的通讯问题简单的实例代码
Jul 19 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
Aug 08 Javascript
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
May 19 jQuery
JS+JQuery实现无缝连接轮播图
Dec 30 jQuery
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
150kHz到30Mhz完全冲浪手册
2020/03/20 无线电
PHP设计模式之调解者模式的深入解析
2013/06/13 PHP
解析php中session的实现原理以及大网站应用应注意的问题
2013/06/17 PHP
浅谈PHP中JSON数据操作
2015/07/01 PHP
PHP图片添加水印功能示例小结
2016/10/03 PHP
php readfile下载大文件失败的解决方法
2017/05/22 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
Javascript实现的鼠标经过时播放声音
2010/05/18 Javascript
ajax更新数据后,jquery、jq失效问题
2011/03/16 Javascript
jQuery读取和设定KindEditor值的方法
2013/11/22 Javascript
JavaScript通过Date-Mask将日期转换成字符串的方法
2015/06/04 Javascript
浅谈js-FCC算法Friendly Date Ranges(详解)
2017/04/10 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
2018/03/02 Javascript
详解vue项目打包后通过百度的BAE发布到网上的流程
2018/03/05 Javascript
JavaScript代码实现txt文件的上传预览功能
2018/03/27 Javascript
ES6 fetch函数与后台交互实现
2018/11/14 Javascript
微信小程序自定义弹出模态框禁止底部滚动功能
2020/03/09 Javascript
Ant design vue中的联动选择取消操作
2020/10/31 Javascript
粗略分析Python中的内存泄漏
2015/04/23 Python
Python random模块用法解析及简单示例
2017/12/18 Python
Python实现string字符串连接的方法总结【8种方式】
2018/07/06 Python
Python绘制并保存指定大小图像的方法
2019/01/10 Python
浅谈python3.6的tkinter运行问题
2019/02/22 Python
Python 动态导入对象,importlib.import_module()的使用方法
2019/08/28 Python
详解有关PyCharm安装库失败的问题的解决方法
2020/02/02 Python
Python 实现Image和Ndarray互相转换
2020/02/19 Python
django实现模型字段动态choice的操作
2020/04/01 Python
Python使用正则表达式实现爬虫数据抽取
2020/08/17 Python
Pytorch实验常用代码段汇总
2020/11/19 Python
selenium3.0+python之环境搭建的方法步骤
2021/02/01 Python
2014年教学管理工作总结
2014/12/02 职场文书
停课通知书
2015/04/24 职场文书
入党后的感想
2015/08/10 职场文书
少先大队干部竞选稿
2015/11/20 职场文书
CSS变量实现主题切换的方法
2021/06/23 HTML / CSS
Python中生成随机数据安全性、多功能性、用途和速度方面进行比较
2022/04/14 Python