javascript中callee与caller的用法和应用场景


Posted in Javascript onDecember 08, 2010

caller :
functionName.caller 返回调用者。

看看下面的函数,大家可以复制到VS中执行下

function caller() { 
if (caller.caller) { 
alert(caller.caller.toString()); 
} else { 
alert("函数直接执行"); 
} 
} 
function handleCaller() { 
caller(); 
} 
handleCaller(); 
caller();

大家会发现第一个alert会弹出调用caller函数的调用者handleCaller,而第二个alert由于没有在其他函数体内调用,所以caller为null,就执行了 alert("函数直接执行");

callee:

返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文.
callee是arguments 的一个属性成员,它表示对函数对象本身的引用,这有利于匿名

函数的递归或者保证函数的封装性。 下面一段代码先说明callee的用法,实例代码摘自网上

function calleeLengthDemo(arg1, arg2) { 
alert(arguments.callee.toString()); 
if (arguments.length == arguments.callee.length) { 
window.alert("验证形参和实参长度正确!"); 
return; 
} else { 
alert("实参长度:" + arguments.length); 
alert("形参长度: " + arguments.callee.length); 
} 
} 
calleeLengthDemo(1);

第一个消息框弹出calleeLengthDemo函数本身,这说明callee就是函数本身对象的引用。callee还有个非常有用的应用就是用来判断实际参数跟行参是否一致。上面的代码第一个消息框会弹出实际参数的长度为1,形式参数也就是函数本身的参数长度为2.

应用场景:
callee的应用场景一般用于匿名函数
大家看下下面一段代码 摘自网络

var fn=function(n){ 
if(n>0) return n+fn(n-1); 
return 0; 
} 
alert(fn(10))

函数内部包含了对自身的引用,函数名仅仅是一个变量名,在函数内部调用即相当于调用
一个全局变量,不能很好的体现出是调用自身,这时使用callee会是一个比较好的方法
var fn=(function(n){ 
if(n>0) return n+arguments.callee(n-1); 
return 0; 
})(10); 
alert(fn)

这样就让代码更加简练。又防止了全局变量的污染。

caller的应用场景 主要用于察看函数本身被哪个函数调用。

Javascript 相关文章推荐
Jquery 过滤器(first,last,not,even,odd)的使用
Jan 22 Javascript
关于JavaScript对象的动态选择及遍历对象
Mar 10 Javascript
Javascript原型链和原型的一个误区
Oct 22 Javascript
JS采用绝对定位实现回到顶部效果完整实例
Jun 20 Javascript
微信小程序tabbar不显示解决办法
Jun 08 Javascript
jquery图片放大镜效果
Jun 23 jQuery
vue.js与后台数据交互的实例讲解
Aug 08 Javascript
VUE-Table上绑定Input通过render实现双向绑定数据的示例
Aug 27 Javascript
使用pm2自动化部署node项目的方法步骤
Jan 28 Javascript
一些手写JavaScript常用的函数汇总
Apr 16 Javascript
微信小程序实现比较功能的方法汇总(五种方法)
Mar 07 Javascript
JS Web Flex弹性盒子模型代码实例
Mar 10 Javascript
js下通过prototype扩展实现indexOf的代码
Dec 08 #Javascript
在JQuery dialog里的服务器控件 事件失效问题
Dec 08 #Javascript
jquery蒙版控件实现代码
Dec 08 #Javascript
基于JQuery制作的产品广告效果
Dec 08 #Javascript
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
Dec 08 #Javascript
写js时遇到的一些小问题
Dec 06 #Javascript
javascript定义函数的方法
Dec 06 #Javascript
You might like
destoon在360浏览器下出现用户被强行注销的解决方法
2014/06/26 PHP
php.ini中的request_order推荐设置
2015/05/10 PHP
PHP格式化显示时间date()函数代码
2018/10/03 PHP
PHP扩展安装方法步骤解析
2020/11/24 PHP
一些有关检查数据的JS代码
2006/09/07 Javascript
JavaScript var声明变量背后的原理示例解析
2013/10/12 Javascript
获得Javascript对象属性个数的示例代码
2013/11/21 Javascript
无限树Jquery插件zTree的常用功能特性总结
2014/09/11 Javascript
jQuery中的pushStack实现原理和应用实例
2015/02/03 Javascript
jQuery点缩略图弹出层显示大图片
2015/02/13 Javascript
AngularJS基础 ng-if 指令用法
2016/08/01 Javascript
jQuery倒计时代码(超简单)
2017/02/27 Javascript
vue cli构建的项目中请求代理与项目打包问题
2018/02/26 Javascript
nodeJS进程管理器pm2的使用
2019/01/09 NodeJs
[01:33]完美世界DOTA2联赛PWL S3 集锦第二期
2020/12/21 DOTA
python实现公司年会抽奖程序
2019/01/22 Python
Python语言检测模块langid和langdetect的使用实例
2019/02/19 Python
python下载微信公众号相关文章
2019/02/26 Python
Python 一键制作微信好友图片墙的方法
2019/05/16 Python
python 设置输出图像的像素大小方法
2019/07/04 Python
Python docutils文档编译过程方法解析
2020/06/23 Python
Python pytesseract验证码识别库用法解析
2020/06/29 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
Django前后端分离csrf token获取方式
2020/12/25 Python
英国轻奢珠宝品牌:Astley Clarke
2016/12/18 全球购物
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
如何设置Java的运行环境
2013/04/05 面试题
上海天奕面试题笔试题
2015/04/19 面试题
营业员演讲稿
2013/12/30 职场文书
公司人力资源的自我评价
2014/01/02 职场文书
2014春晚主持词
2014/03/25 职场文书
个人作风建设总结
2014/10/23 职场文书
2014年老干部工作总结
2014/11/21 职场文书
食品安全主题班会
2015/08/13 职场文书
js实现自动锁屏功能
2021/06/02 Javascript
python 网络编程要点总结
2021/06/18 Python