现在已经不推荐使用arguments.callee();
原因:访问arguments是个很昂贵的操作,因为它是个很大的对象,每次递归调用时都需要重新创建。影响现代浏览器的性能,还会影响闭包。

但是,arguments并非一无是处,arguments还是有优点的,如下:

arguments为函数内部对象,包含传入函数的所有参数,arguments.callee代表函数名,多用于递归调用,防止函数执行与函数名紧紧耦合的现象,对于没

有函数名的匿名函数也非常起作用.

javaScript中递归和arguments.callee知识点

【JavaScript】arguments.callee的作用及替换方案

arguments.callee的用法

callee和caller

arguments.callee

命名函数表达式--有标识符的函数表达式

命名函数表达式

对于递归,使用arguments.callee代替函数名,可以确保调用函数不出问题,但是在严格模式下,不能通过脚本访问argumnts.callee,这时,可以使用命名函数表达式来达到相同的效果。 如下代码:

var myFun = (function f(num) {//console.log(f);if (num <= 1) {return 1;}else {return num * f(num - 1);}
});

案例1

/*
现在已经不推荐使用arguments.callee();
原因:访问arguments是个很昂贵的操作,因为它是个很大的对象,每次递归调用时都需要重
新创建。影响现代浏览器的性能,还会影响闭包。
*/
console.log("***************************");//一道面试题,接受参数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;})();
}var result = show(5);
console.log(result); //[1, 2, 3, 4, 5]//现在已经不推荐使用arguments.callee()
//改成如下:
function show2(n) {var arr = [];return (function fn() {arr.unshift(n);n--;if (n != 0) {fn(); //}return arr;})();
}var result2 = show2(5);
console.log(result2); //[1, 2, 3, 4, 5]console.log("***************************");

运行结果如下:

案例2

//
function factorial(num) {if (num <= 1) {return 1;} else {return num * arguments.callee(num - 1);}
}var r1 = factorial(5);
console.log("**A**", r1);//同理,可以将上面的代码改成如下:
function myFactorial(num) {if (num <= 1) {return 1;}var myResult = 1;return (function fn() {myResult *= num;num--;if (num != 0) {fn();}return myResult;})();
}var r2 = myFactorial(5);
console.log("**B**", r2);

运行结果如下:

完整代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>javaScript中递归和arguments.callee知识点</title>
<style type="text/css">
input[type=button] {background-color: #8E388E;border: 0px solid #8E388E;color: #fff;width: 160px;height: 40px;border-radius: 6px; /*把边框做成圆角*/
}</style>
<script type="text/javascript">
/*
现在已经不推荐使用arguments.callee();
原因:访问arguments是个很昂贵的操作,因为它是个很大的对象,每次递归调用时都需要重
新创建。影响现代浏览器的性能,还会影响闭包。
*/
console.log("***************************");//一道面试题,接受参数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;})();
}var result = show(5);
console.log(result); //[1, 2, 3, 4, 5]//现在已经不推荐使用arguments.callee()
//改成如下:
function show2(n) {var arr = [];return (function fn() {arr.unshift(n);n--;if (n != 0) {fn(); //}return arr;})();
}var result2 = show2(5);
console.log(result2); //[1, 2, 3, 4, 5]console.log("***************************");
//
function factorial(num) {if (num <= 1) {return 1;} else {return num * arguments.callee(num - 1);}
}var r1 = factorial(5);
console.log("**A**", r1);//同理,可以将上面的代码改成如下:
function myFactorial(num) {if (num <= 1) {return 1;}var myResult = 1;return (function fn() {myResult *= num;num--;if (num != 0) {fn();}return myResult;})();
}var r2 = myFactorial(5);
console.log("**B**", r2);</script>
</head>
<body style="background-color: #CCE8CF;">
<h1>javaScript中递归和arguments.callee知识点</h1>
<input type="button" value="字符串的slice()函数">
<div id="div1" style="background-color: Wheat; height: 100%;">
</div>
</body>
</html>

大家可以举一反三,触类旁通!

javaScript中递归和arguments.callee相关推荐

  1. Javascript中递归造成的堆栈溢出及解决方案

    Javascript中递归造成的堆栈溢出及解决方案 参考文章: (1)Javascript中递归造成的堆栈溢出及解决方案 (2)https://www.cnblogs.com/cuew1987/p/4 ...

  2. JavaScript中递归使用

    递归的概念 在程序中函数直接或间接调用自己 直接调用自己 简介调用自己 跳出结构,有了跳出才有结果 递归的思想 递归的调用,最终还是要转换为自己这个函数 如果有个函数foo,如果他是递归函数,到最后问 ...

  3. javaScript中arguments.callee知识点

    javaScript中递归和arguments.callee javaScript中递归和arguments.callee知识点 arguments.callee 运行结果如下: 源码如下: < ...

  4. 你知道 JavaScript 中的 Arguments 对象都有哪些用途吗?

    JavaScript 中 Arguments 对象的用途总结. 前言 相信我们很多人在代码开发的过程中都使用到过一个特殊的对象 -- Arguments 对象. 在实际开发中,Arguments 对象 ...

  5. 浅谈arguments.callee

      在函数内部有两个特殊对象:this和arguments,其中,arguments主要用于保存函数的参数,但这个对象还有一个名叫callee的属性,该属性是个指针,指向拥有这个arguments对象 ...

  6. JavaScript中的arguments,callee,caller

    2019独角兽企业重金招聘Python工程师标准>>> arguments: arguments 该对象代表正在执行的函数和调用它的函数的参数. [function.]argumen ...

  7. JavaScript函数之实际参数对象(arguments) / callee属性 / caller属性 / 递归调用 / 获取函数名称的方法...

    函数的作用域:调用对象 JavaScript中函数的主体是在局部作用域中执行的,该作用域不同于全局作用域.这个新的作用域是通过将调用对象添加到作用域链的头部而创建的(没怎么理解这句话,有理解的亲可以留 ...

  8. JavaScript中的arguments,callee,caller,call,appy

    代码 <script language="JavaScript"> /* * 演示arguments的用法,如何获取实参数和形数数 */ function argTes ...

  9. 【转】全面理解javascript的arguments,callee,caller,call,apply概念(修改版)

    (注:在看到大家如此关注JS里头的这几个对象,我试着把原文再修改一下,力求能再详细的阐明个中意义  2007-05-21) 在提到上述的概念之前,首先想说说javascript中函数的隐含参数:arg ...

最新文章

  1. JPA 复杂查询 - Querydsl
  2. Seq2Seq实现闲聊机器人
  3. python画彩虹爱心_用python画一颗彩虹色爱心送给女朋友!!!
  4. Java中如何编写一个完美的equals方法
  5. 根据×××号码识别性别年龄生日的JS代码
  6. VisualStudio移动开发(C#、VB.NET)Smobiler开发平台——VoiceRecorder控件的使用方式.Net移动开发...
  7. ImageView显示图像控件
  8. BeanUtils.copyProperties设置忽略null字段
  9. mysql数据库配置步骤,MySQL数据库安装配置步骤详解
  10. 论文阅读:《Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neu》
  11. CDlinux 安装
  12. 戴尔3080计算机重装系统步骤,终于发现戴尔笔记本重装系统的方法
  13. 北大计算机就业报告,北京大学信息科学技术学院解读和毕业生就业统计
  14. 2021多校补题(8)
  15. NER项目--github--A Unified MRC Framework for Named Entity Recognition
  16. 昊海微信拼团php,最新微信昊海拼团系统独立版源码分享,微信团购关注送红包送优惠卷功能,附说明文档...
  17. xmanager linux 远程桌面,Xmanager连接CentOS的远程桌面
  18. 淘宝京东APP节日更新布局 实现方式
  19. 在win10中AsciiDoc使用plantUML的使用报错:Dot Executable:C:\Program Files\Graphviz2.38 it should be an executa
  20. 浙大oj(basic level)1002

热门文章

  1. 基于51单片机的倒车雷达设计
  2. make-sense | 图像标注工具
  3. idea官网下载(版本自选)
  4. 脑数据有多重要?脑机接口有哪些商业应用?
  5. 线程?对!!这就是Java线程超级细致解读---Java学习总结
  6. 多迪就业数据显示:Php和Java哪个好?
  7. layer iframe 设置关闭按钮
  8. Codeup100000567问题 E: 习题4-10-1 奖金计算
  9. 互联网电商新商机,亚马逊无货源模式是否真的可行?
  10. 青龙面板改端口,远离5700,保姆教程