JavaScript中callee和caller的区别与用法实例分析


Posted in Javascript onJune 28, 2019

本文实例讲述了JavaScript中callee和caller的区别与用法。分享给大家供大家参考,具体如下:

1.callee

在函数的内部,有两个特殊的对象:arguments和this。其中arguments是一个类似数组的对象,包含着传入函数的所有参数。

虽然arguments的主要用途是保存函数参数,但这个对象有一个属性——callee,该属性是一个指针,指向拥有这个arguments对象的函数

所以callee的作用就是来指向当前对象

看一个阶层函数的例子就会明白他的用途了:

/*
 * 普通的递归阶层函数
 */
function factorial(num){
  if(num <= 1){
    return 1;
  }else{
    return num *factorial(num-1);
  }
}

上面的代码运行没有问题,但这个函数的执行与函数名factorial紧紧耦合在一起了,要是改变了函数名,里面的函数名也要随着改变,这样很不方便,所以我们用arguments.callee来消除这种耦合。

//使用callee属性的递归阶层函数
function factorial1(num){
  if(num <= 1){
    return 1;
  }else{
    return num * arguments.callee(num-1);
  }
}

根据callee的定义,callee是arguments对象的一个属性,指向拥有arguments对象的函数,这个函数就是factorial1 (factorial1=arguments.callee),他们指向的都是上面的递归函数。请记住函数的名字仅仅是一个包含指针的变量而已。

2.caller

caller是函数对象的一个属性,该属性保存着调用当前函数的函数的引用(指向当前函数的直接父函数)

返回一个对函数的引用,该函数调用了当前函数。

function a(){//父函数
  b();
};
function b(){
  console.info(b.caller);
};
a(); //结果就是弹出函数a和内容

可以看到函数b的属性caller调用当前函数b的函数引用a(就是指向当前函数b的父函数a)

3.将callee和caller结合起来使用

function b(){
  alert(b.caller);
};

从这个代码可以看出b函数中调用了b函数名,这样当函数名改变时就很不方便,我们需要替换里面的那个b

前面我们知道用什么方法可以指向当前对象,下面我们就来修改一下:

(function a(){
  b();
})();
function b(){
  alert(arguments.callee.caller);//用arguments.callee代替了b
};

JavaScript中callee和caller的区别与用法实例分析

4.实例:斐波那契数列(用递归思想)

如果一对兔子每月生一对兔子;一对新生兔,从第二个月起就开始生兔子;假定每对兔子都是一雌一雄,试问一对兔子,第n个月能繁殖成多少对兔子?(使用callee完成)

var result=[];
function fn(n){
  if(n==1){
    return 1;
  }else if(n==2){
    return 1;
  }else {
    if(result[n]){
      return result[n];
    }else{
      //arguments.callee(...)=fn(...)
      result[n]=arguments.callee(n-1)+arguments.callee(n-2);
      return result[n];
    }
  }
}

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript 从if else 到 switch case 再到抽象
Jul 17 Javascript
通过JQuery将DIV的滚动条滚动到指定的位置方便自动定位
May 05 Javascript
jQuery使用addClass()方法给元素添加多个class样式
Mar 26 Javascript
jquery实现右键菜单插件
Mar 29 Javascript
JSON相关知识汇总
Jul 03 Javascript
js实现鼠标点击文本框自动选中内容的方法
Aug 20 Javascript
jQuery的图片轮播插件PgwSlideshow使用详解
Aug 11 Javascript
使用jQuery实现页面定时弹出广告效果
Aug 24 jQuery
prototype.js简单实现ajax功能示例
Oct 18 Javascript
vue拖拽排序插件vuedraggable使用方法详解
Aug 21 Javascript
Vue源码分析之Vue实例初始化详解
Aug 25 Javascript
微信小程序弹窗禁止页面滚动的实现代码
Dec 30 Javascript
JS字符串与二进制的相互转化实例代码详解
Jun 28 #Javascript
JS中call()和apply()的功能及用法实例分析
Jun 28 #Javascript
webpack4.0+vue2.0利用批处理生成前端单页或多页应用的方法
Jun 28 #Javascript
用Vue.js方法创建模板并使用多个模板合成
Jun 28 #Javascript
js实现随机数小游戏
Jun 28 #Javascript
Node爬取大批量文件的方法示例
Jun 28 #Javascript
JavaScript实现单英文金山打字通
Jul 24 #Javascript
You might like
php中如何判断一个网页请求是ajax请求还是普通请求
2013/08/10 PHP
CodeIgniter框架提示Disallowed Key Characters的解决办法
2014/04/21 PHP
ThinkPHP登录功能的实现方法
2014/08/20 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
2020/05/02 PHP
关于 byval 与 byref 的区别分析总结
2007/10/08 Javascript
仿当当网淘宝网等主流电子商务网站商品分类导航菜单
2013/09/25 Javascript
弹出最简单的模式化遮罩层的js代码
2013/12/04 Javascript
ListBox实现上移,下移,左移,右移的简单实例
2014/02/13 Javascript
jQuery实现base64前台加密解密功能详解
2017/08/29 jQuery
浅谈JavaScript find 方法不支持IE的问题
2017/09/28 Javascript
让bootstrap的carousel支持滑动滚屏的实现代码
2017/11/27 Javascript
vue 实现数字滚动增加效果的实例代码
2018/07/06 Javascript
细述Javascript的加法运算符的具体使用
2019/10/18 Javascript
浅谈vue单页面中有多个echarts图表时的公用代码写法
2020/07/19 Javascript
[43:24]VG vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python使用redis pool的一种单例实现方式
2016/04/16 Python
Python如何快速实现分布式任务
2017/07/06 Python
Python简单定义与使用二叉树示例
2018/05/11 Python
influx+grafana自定义python采集数据和一些坑的总结
2018/09/17 Python
浅谈pycharm下找不到sqlalchemy的问题
2018/12/03 Python
python 定时器,轮询定时器的实例
2019/02/20 Python
Python实现字符型图片验证码识别完整过程详解
2019/05/10 Python
详解Python二维数组与三维数组切片的方法
2019/07/18 Python
pytorch实现用CNN和LSTM对文本进行分类方式
2020/01/08 Python
利用Python中的Xpath实现一个在线汇率转换器
2020/09/09 Python
师范应届生教师求职信
2013/11/05 职场文书
毕业学生推荐信
2013/12/01 职场文书
银行实习鉴定
2013/12/13 职场文书
房产销售经理职责
2013/12/20 职场文书
求职毕业生自荐书
2014/02/08 职场文书
监督检查工作方案
2014/05/28 职场文书
2014办公室年度工作总结
2014/12/09 职场文书
体育部部长竞选稿
2015/11/21 职场文书
使用Html+Css实现简易导航栏功能(导航栏遇到鼠标切换背景颜色)
2021/04/07 HTML / CSS