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 相关文章推荐
鼠标经过的文本框textbox变色
May 21 Javascript
js prototype截取字符串函数
Apr 01 Javascript
面向对象的Javascript之二(接口实现介绍)
Jan 27 Javascript
再谈querySelector和querySelectorAll的区别与联系
Apr 20 Javascript
DOM节点深度克隆函数cloneNode()用法实例
Jan 12 Javascript
Google 爬虫如何抓取 JavaScript 的内容
Apr 07 Javascript
js实现延迟加载的几种方法
Apr 24 Javascript
JavaScript30 一个月纯 JS 挑战中文指南(英文全集)
Jul 23 Javascript
详解vue组件中使用路由方法
Feb 12 Javascript
JavaScript实现抖音罗盘时钟
Oct 11 Javascript
小程序外卖订单界面的示例代码
Dec 30 Javascript
vue使用require.context实现动态注册路由
Dec 25 Vue.js
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 获取本地IP代码
2013/06/23 PHP
php使用ICQ网关发送手机短信
2013/10/30 PHP
php定时计划任务与fsockopen持续进程实例
2014/05/23 PHP
重新认识php array_merge函数
2014/08/31 PHP
Jquery AutoComplete自动完成 的使用方法实例
2010/03/19 Javascript
jquery 插件学习(四)
2012/08/06 Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
2013/11/04 Javascript
javascript:json数据的页面绑定示例代码
2014/01/26 Javascript
深入理解JS addLoadEvent函数
2016/05/20 Javascript
jQuery插件简单学习实例教程
2016/07/01 Javascript
javascript 中iframe高度自适应(同域)实例详解
2017/05/16 Javascript
详解在React中跨组件分发状态的三种方法
2018/08/09 Javascript
微信小程序向Java后台传输参数的方法实现
2020/12/10 Javascript
[03:01]DOTA2英雄基础教程 露娜
2014/01/07 DOTA
Python求导数的方法
2015/05/09 Python
Python2.7+pytesser实现简单验证码的识别方法
2017/12/29 Python
Django web框架使用url path name详解
2019/04/29 Python
浅谈Django2.0 加xadmin踩的坑
2019/11/15 Python
python3的UnicodeDecodeError解决方法
2019/12/20 Python
Django 解决新建表删除后无法重新创建等问题
2020/05/21 Python
python:HDF和CSV存储优劣对比分析
2020/06/08 Python
简单的Python人脸识别系统
2020/07/14 Python
python中的split、rsplit、splitlines用法说明
2020/10/23 Python
Python暴力破解Mysql数据的示例
2020/11/09 Python
python3 googletrans超时报错问题及翻译工具优化方案 附源码
2020/12/23 Python
如何开发一款堪比APP的微信小程序(腾讯内部团队分享)
2016/12/22 HTML / CSS
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
澳大利亚潮流尖端的快时尚品牌:Cotton On
2016/09/26 全球购物
团工委书记自荐书范文
2013/12/17 职场文书
教师党员一句话承诺
2014/03/28 职场文书
2014年财务人员工作总结
2014/11/11 职场文书
2014年少先队工作总结
2014/12/03 职场文书
2016年春节慰问信息大全
2015/11/30 职场文书
护理自荐信
2019/05/14 职场文书
Python绘制散点图之可视化神器pyecharts
2022/07/07 Python