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 相关文章推荐
SUN的《AJAX与J2EE》全文译了
Feb 23 Javascript
JSQL SQLProxy 的 php 版本代码
May 05 Javascript
5分钟理解JavaScript中this用法分享
Nov 09 Javascript
JavaScript中创建类/对象的几种方法总结
Nov 29 Javascript
Javascript动态创建表格及删除行列的方法
May 15 Javascript
利用jQuery和CSS将背景图片拉伸
Oct 16 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
Oct 31 Javascript
JS制作图形验证码实现代码
Oct 19 Javascript
JavaScript常见的五种数组去重的方式
Dec 15 Javascript
canvas学习之API整理笔记(二)
Dec 29 Javascript
Bootstrap实现的标签页内容切换显示效果示例
May 25 Javascript
微信小程序进入广告实现代码实例
Sep 19 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
IIS7.X配置PHP运行环境小结
2011/06/09 PHP
destoon实现公司新闻详细页添加评论功能的方法
2014/07/15 PHP
php多次include后导致全局变量global失效的解决方法
2015/02/28 PHP
ThinkPHP框架实现的MySQL数据库备份功能示例
2018/05/24 PHP
JavaScript 检测浏览器和操作系统的脚本
2008/12/26 Javascript
javascript 面向对象全新理练之数据的封装
2009/12/03 Javascript
ExtJS下grid的一些属性说明
2009/12/13 Javascript
jquery 插件实现图片延迟加载效果代码
2010/02/06 Javascript
JavaScript prototype对象的属性说明
2010/03/13 Javascript
NodeJS与Mysql的交互示例代码
2013/08/18 NodeJs
JavaScript实现俄罗斯方块游戏过程分析及源码分享
2015/03/23 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
2016/08/04 Javascript
vue loadmore 组件滑动加载更多源码解析
2017/07/19 Javascript
vue-quill-editor实现图片上传功能
2017/08/08 Javascript
详解react-native WebView 返回处理(非回调方法可解决)
2018/02/27 Javascript
浅谈React组件之性能优化
2018/03/02 Javascript
Vue微信项目按需授权登录策略实践思路详解
2018/05/07 Javascript
对VUE中的对象添加属性
2018/09/18 Javascript
搭建基于express框架运行环境的方法步骤
2018/11/15 Javascript
koa+jwt实现token验证与刷新功能
2019/05/30 Javascript
[14:21]VICI vs EG (BO3)
2018/06/07 DOTA
[55:26]DOTA2-DPC中国联赛 正赛 Aster vs LBZS BO3 第一场 2月23日
2021/03/11 DOTA
Python实现检测服务器是否可以ping通的2种方法
2015/01/01 Python
Python 利用pydub库操作音频文件的方法
2019/01/09 Python
python实现翻译word表格小程序
2020/02/27 Python
Python建造者模式案例运行原理解析
2020/06/29 Python
用python批量移动文件
2021/01/14 Python
利用python为PostgreSQL的表自动添加分区
2021/01/18 Python
Ellos瑞典官网:北欧地区时尚、美容和住宅领域领先的电子商务网站
2019/11/21 全球购物
JSP&Servlet技术面试题
2015/05/21 面试题
计算机专业优秀大学生自我总结
2014/01/21 职场文书
能源工程专业应届生求职信
2014/03/01 职场文书
护理学专业求职信
2014/06/29 职场文书
群众路线党员个人整改措施
2014/10/27 职场文书
《思路决定出路》读后感3篇
2019/12/11 职场文书
vue项目支付功能代码详解
2022/02/18 Vue.js