JavaScript中的callee和caller的用法
callee
callee是对象的一个属性,它一个指针,指向参数arguments对象的函数,用过
argument.callee
的方式来指向该函数;
看下面这段递归函数:
function factorial(num){if (num <= 1)return 1;elsereturn num * factorial(num - 1);
}
let subFactorial = factorial;
factorial = null;
console.log(subFactorial(3));//报错
上面的代码会报下面的错误:
- 我们把
factorial()
函数保存到一个subFactorial
变量中,然后把-factorial
设为null
,只保留一个引用;- 但是在调用
subFactorial()
的时候会报错,为什么呢?我们不是已经把factorial()
函数存到subFactorial
中了吗?- 如果我们仔细看代码的话就会发现一个问题,在调用递归的时候我们还是需要调用
factorial()
函数才能实现,但是在我们将factorial
设为null
的情况下是访问不到的,所以这样非常的不方便;
于是我们采用callee的方式来解决这个问题:
function factorial(num){if (num <= 1)return 1;elsereturn num * arguments.callee(num - 1)
}
let subFactorial = factorial;
factorial = null;
console.log(subFactorial(3));//6
将递归要调用的函数
factorial()
改为arguments.callee()
,由于arguments.callee
指向的就是正在执行的函数的指针,在函数内部直接调用,它指向的就是该函数本身,所以就算把factorial
设为null
也不会影响到递归的调用;
caller
caller是ECMAScript5提出给函数对象上添加一个属性,这个属性引用的是调用当前函数的函数,或者如果是全局作用域中调用的则为null;
废话少说,上代码:
function a(){b();
}
function b(){console.log(b.caller);
}
a();
打印的结果是a()函数的源代码:
很明显,这里已经可以看出来了,上面的代码调用了
a()
函数,a()
中又执行了b()
,最后b()
函数打印出b.caller
,这里的b.caller
就是当前调用了b()
函数的a()
函数,所以打印出来的就是a()
函数的源代码。
我们还可以用arguments.callee.caller
的方式来降低他们之间的耦合度,比如:
function a(){b();
}
function b(){console.log(arguments.callee.caller);
}
a();
JavaScript中的callee和caller的用法相关推荐
- java中的感叹号是_[Java教程]javascript中的2个感叹号的用法
[Java教程]javascript中的2个感叹号的用法 0 2014-04-15 19:00:09 !!是逻辑"非非",即是在逻辑"非"的基础上再" ...
- javaScript中arguments.callee知识点
javaScript中递归和arguments.callee javaScript中递归和arguments.callee知识点 arguments.callee 运行结果如下: 源码如下: < ...
- JavaScript中callee和caller的用法解读
1.callee: callee是对象的一个属性,该属性是一个指针,指向参数arguments对象的函数. 作用:指向当前对象. 例1: <script type="text/java ...
- javascript中setInterval,setTimeout的区别跟用法
setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭. se ...
- 关于手机号码、邮箱的在JavaScript中的正则表达式和其简单用法
首先介绍如何使用javascript正则来匹配中国电信段手机号码: 1.电信段分别有:133,153,180,181,189,177 总共六个号段 2.第一位为数字1 3.第二位分别是3,5,7,8 ...
- JavaScript中匿名函数的作用和用法
匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染. 这在给一个不是很熟悉的页面增加Javascript时非常有效,也很优美. 例: <!DOCTYPE html& ...
- javaScript中const,var,let区别与用法详解
业务场景:今天想从正则表达式数组对象取出几个参数的值,发现好多人都用的const声明的变量,这里一起总结一下吧. 上一篇-->前端使用正则表达式获取地址栏URL参数的值并将需要的参数值展示在页面 ...
- html 反引号 用法,JavaScript中的反引号符号(`)的用法是什么?
ES6提供了一种新类型的字符串文字,使用反向标记作为分隔符.这些文字确实允许嵌入基本的字符串插值表达式,然后自动解析和评估它们. let person = {name:'RajiniKanth',a ...
- JavaScript中圆括号()和方括号[]的一个特殊用法
缘由: JS这个语言实在过于灵活,当然其不足之处也有很多.当今各种开源JS脚本铺天盖地,所以很多人的编程风格一下涌到你面前,特别是那些大师级的JS编码风格与技巧. 在最近分析NIKE这个网站源码时,看 ...
最新文章
- python_模块学习
- kafka php 0.8,php5.6 centos7 kafka0.8.1
- ffmpeg检测文件是否损坏_教你一招如何检测硬盘,让你知道硬盘是否有损坏?还有几天寿命?...
- 深度学习笔记(17) 误差分析(二)
- 修改mysql默认字符集的方法
- 搭建windows的solr6服务器
- 清除图片下默认的小间隙_PowerMILL软件应用策略(一):模型区域清除策略
- JZ6-旋转数组的最小数字
- DBN-RBM TensorFlow实现
- 【CF585-div2:C】Swap Letters(贪心)
- Axure RP 6.5中文汉化包及汉化方法
- Centos 7镜像官网下载
- 代理服务器好帮手--SOCKS2HTTP
- 不懂Shopee站点分析,入驻Shopee平台哪个站点?
- Criss-Cross Attention for Semantic Segmentation论文及代码分析
- 替换修改windows xp字体,为windows 7微软雅黑
- [笑话]让古龙看了要痛哭的高考作文(作品相当强,但得了零分,据说被破格入取了)!!!...
- Web端的邮件内容HTML格式规范总结
- 关于换行以及换行属性
- linux开启swap(磁盘缓存)操作