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的用法相关推荐

  1. java中的感叹号是_[Java教程]javascript中的2个感叹号的用法

    [Java教程]javascript中的2个感叹号的用法 0 2014-04-15 19:00:09 !!是逻辑"非非",即是在逻辑"非"的基础上再" ...

  2. javaScript中arguments.callee知识点

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

  3. JavaScript中callee和caller的用法解读

    1.callee: callee是对象的一个属性,该属性是一个指针,指向参数arguments对象的函数. 作用:指向当前对象. 例1: <script type="text/java ...

  4. javascript中setInterval,setTimeout的区别跟用法

    setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭. se ...

  5. 关于手机号码、邮箱的在JavaScript中的正则表达式和其简单用法

    首先介绍如何使用javascript正则来匹配中国电信段手机号码: 1.电信段分别有:133,153,180,181,189,177 总共六个号段 2.第一位为数字1 3.第二位分别是3,5,7,8 ...

  6. JavaScript中匿名函数的作用和用法

    匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染. 这在给一个不是很熟悉的页面增加Javascript时非常有效,也很优美. 例: <!DOCTYPE html& ...

  7. javaScript中const,var,let区别与用法详解

    业务场景:今天想从正则表达式数组对象取出几个参数的值,发现好多人都用的const声明的变量,这里一起总结一下吧. 上一篇-->前端使用正则表达式获取地址栏URL参数的值并将需要的参数值展示在页面 ...

  8. html 反引号 用法,JavaScript中的反引号符号(`)的用法是什么?

    ES6提供了一种新类型的字符串文字,使用反向标记作为分隔符.这些文字确实允许嵌入基本的字符串插值表达式,然后自动解析和评估它们. let  person = {name:'RajiniKanth',a ...

  9. JavaScript中圆括号()和方括号[]的一个特殊用法

    缘由: JS这个语言实在过于灵活,当然其不足之处也有很多.当今各种开源JS脚本铺天盖地,所以很多人的编程风格一下涌到你面前,特别是那些大师级的JS编码风格与技巧. 在最近分析NIKE这个网站源码时,看 ...

最新文章

  1. python_模块学习
  2. kafka php 0.8,php5.6 centos7 kafka0.8.1
  3. ffmpeg检测文件是否损坏_教你一招如何检测硬盘,让你知道硬盘是否有损坏?还有几天寿命?...
  4. 深度学习笔记(17) 误差分析(二)
  5. 修改mysql默认字符集的方法
  6. 搭建windows的solr6服务器
  7. 清除图片下默认的小间隙_PowerMILL软件应用策略(一):模型区域清除策略
  8. JZ6-旋转数组的最小数字
  9. DBN-RBM TensorFlow实现
  10. 【CF585-div2:C】Swap Letters(贪心)
  11. Axure RP 6.5中文汉化包及汉化方法
  12. Centos 7镜像官网下载
  13. 代理服务器好帮手--SOCKS2HTTP
  14. 不懂Shopee站点分析,入驻Shopee平台哪个站点?
  15. Criss-Cross Attention for Semantic Segmentation论文及代码分析
  16. 替换修改windows xp字体,为windows 7微软雅黑
  17. [笑话]让古龙看了要痛哭的高考作文(作品相当强,但得了零分,据说被破格入取了)!!!...
  18. Web端的邮件内容HTML格式规范总结
  19. 关于换行以及换行属性
  20. linux开启swap(磁盘缓存)操作

热门文章

  1. 易语言组合框去重复到列表框
  2. csdn中关于程序员的一封信
  3. ERP演义-2003年中国ERP市场点评·上
  4. AMOS模型拟合得出影响力系数的操作步骤
  5. 软考专题一:挣值计算
  6. 各大电商API,包括淘宝天猫的Api明细接口
  7. Angular 教程:英雄之旅
  8. 阿里android社招面经,阿里社招面经(已过)
  9. 谷粒商城学习时遇到的一些问题
  10. 什么是全员营销?实施全员营销的4个黄金法则