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 for循环从入门到偏门(效率优化+奇特用法)
Aug 01 Javascript
Jquery选中或取消radio示例
Sep 29 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
Feb 12 Javascript
将字符串中由空格隔开的每个单词首字母大写
Apr 06 Javascript
JavaScript实现基于十进制的四舍五入实例
Jul 17 Javascript
JS中生成随机数的用法及相关函数
Jan 09 Javascript
Highcharts入门之简介
Aug 02 Javascript
vuejs使用FormData实现ajax上传图片文件
Aug 08 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
Sep 10 jQuery
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
Nov 05 Javascript
详解如何在JS代码中消灭for循环
Dec 11 Javascript
详细介绍Next.js脚手架完整搭建封装
Apr 26 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间隔一段时间执行代码的方法
2014/12/02 PHP
php封装的数据库函数与用法示例【参考thinkPHP】
2016/11/08 PHP
PHP数组生成XML格式数据的封装类实例
2016/11/10 PHP
PHP+redis实现微博的推模型案例分析
2019/07/10 PHP
css图片自适应大小
2007/11/28 Javascript
js创建对象的几种常用方式小结(推荐)
2010/10/24 Javascript
JS操作iframe里的dom(实例讲解)
2014/01/29 Javascript
元素未显示设置width/height时IE中使用currentStyle获取为auto
2014/05/04 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
2015/05/16 Javascript
使用HTML+CSS+JS制作简单的网页菜单界面
2015/07/27 Javascript
BootStrap初学者对弹出框和进度条的使用感觉
2016/06/27 Javascript
js导出excel文件的简洁方法(推荐)
2016/11/02 Javascript
微信小程序 详解Page中data数据操作和函数调用
2017/01/12 Javascript
jQuery+CSS3实现点赞功能
2017/03/13 Javascript
Vue2.0父子组件传递函数的教程详解
2017/10/16 Javascript
解析vue中的$mount
2017/12/21 Javascript
React Native使用fetch实现图片上传的示例代码
2018/03/07 Javascript
详解JavaScript添加给定的标签选项
2018/09/17 Javascript
微信小程序Page中data数据操作和函数调用方法
2019/05/08 Javascript
详解Vuex下Store的模块化拆分实践
2019/07/31 Javascript
js+canvas实现刮刮奖功能
2020/09/13 Javascript
Ant-design-vue Table组件customRow属性的使用说明
2020/10/28 Javascript
[01:03]PWL开团时刻DAY6——别打我
2020/11/05 DOTA
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
Python +Selenium解决图片验证码登录或注册问题(推荐)
2020/02/09 Python
python中wx模块的具体使用方法
2020/05/15 Python
CSS3 清除浮动的方法示例
2018/06/01 HTML / CSS
突袭HTML5之Javascript API扩展5—其他扩展(应用缓存/服务端消息/桌面通知)
2013/01/31 HTML / CSS
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
乡镇镇长个人整改措施
2014/10/01 职场文书
2015年双拥工作总结
2015/04/08 职场文书
装修公司管理制度
2015/08/05 职场文书
如何用python识别滑块验证码中的缺口
2021/04/01 Python
python numpy中setdiff1d的用法说明
2021/04/22 Python
Java虚拟机内存结构及编码实战分享
2022/04/07 Java/Android
Android Studio实现带三角函数对数运算功能的高级计算器
2022/05/20 Java/Android