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 相关文章推荐
java script编程起步(第三课)
Jan 10 Javascript
jquery ajax实现下拉框三级无刷新联动,且保存保持选中值状态
Oct 29 Javascript
javascript按位非运算符的使用方法
Nov 14 Javascript
Javascript与jQuery方法的隐藏与显示
Jan 19 Javascript
jQuery制作简洁的图片轮播效果
Apr 03 Javascript
基于jQuery实现多层次的手风琴效果附源码
Sep 21 Javascript
vue2.0数据双向绑定与表单bootstrap+vue组件
Feb 27 Javascript
angularjs ui-router中路由的二级嵌套
Mar 10 Javascript
React-router中结合webpack实现按需加载实例
May 25 Javascript
从对象列表中获取一个对象的方法,依据关键字和值
Sep 20 Javascript
jquery动态添加带有样式的HTML标签元素方法
Feb 24 jQuery
vue2 中二级路由高亮问题及配置方法
Jun 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
php+mysql不用递归实现的无限级分类实例(非递归)
2014/07/08 PHP
php结合安卓客户端实现查询交互实例
2015/05/05 PHP
php实现简易聊天室应用代码
2015/09/23 PHP
PHP中Restful api 错误提示返回值实现思路
2016/04/12 PHP
php实现的http请求封装示例
2016/11/08 PHP
PHP利用递归函数实现无限级分类的方法
2019/03/22 PHP
Laravel+Intervention实现上传图片功能示例
2019/07/09 PHP
Prototype使用指南之selector.js
2007/01/10 Javascript
CSS+Table图文混排中实现文本自适应图片宽度(超简单+跨所有浏览器)
2009/02/14 Javascript
javawscript 三级菜单的实现原理
2009/07/01 Javascript
jquery中输入验证中一个不错的效果
2010/08/21 Javascript
淘宝搜索框效果实现分析
2011/03/05 Javascript
JS去除iframe滚动条的方法
2015/04/01 Javascript
整理关于Bootstrap过渡动画的慕课笔记
2017/03/29 Javascript
JavaScript中闭包的详解
2017/04/01 Javascript
js微信应用场景之微信音乐相册案例分享
2017/08/11 Javascript
vue项目引入Iconfont图标库的教程图解
2018/10/24 Javascript
详解vue-video-player使用心得(兼容m3u8)
2019/08/23 Javascript
Vue 使用beforeEach实现登录状态检查功能
2019/10/31 Javascript
介绍Python中的__future__模块
2015/04/27 Python
python实现文本文件合并
2015/12/29 Python
Swift 3.0在集合类数据结构上的一些新变化总结
2016/07/11 Python
Python迭代和迭代器详解
2016/11/10 Python
详解python中的json的基本使用方法
2016/12/21 Python
Mac中升级Python2.7到Python3.5步骤详解
2017/04/27 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
django使用F方法更新一个对象多个对象字段的实现
2020/03/28 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
2020/07/13 Python
Python类的继承super相关原理解析
2020/10/22 Python
python 实现弹球游戏的示例代码
2020/11/17 Python
如何用 Python 处理不平衡数据集
2021/01/04 Python
MCAKE蛋糕官方网站:一直都是巴黎的味道
2018/02/06 全球购物
食品安全标语
2014/06/07 职场文书
开服装店计划书
2014/08/15 职场文书
县委班子四风对照检查材料思想汇报
2014/09/29 职场文书
xhunter1.sys可以删除嘛? win11提示xhunter1.sys驱动不兼容解决办法
2022/09/23 数码科技