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 相关文章推荐
JS的数组的扩展实例代码
Jul 09 Javascript
JavaScript基础语法、dom操作树及document对象
Dec 02 Javascript
jQuery判断元素是否显示 是否隐藏的简单实现代码
May 19 Javascript
JS使用单链表统计英语单词出现次数
Jun 16 Javascript
禁用backspace网页回退功能的实现代码
Nov 15 Javascript
Vue数据驱动模拟实现5
Jan 13 Javascript
JavaScript数组复制详解
Feb 02 Javascript
javascript中apply/call和bind的使用
Feb 15 Javascript
vue2.0中click点击当前li实现动态切换class
Jun 21 Javascript
JavaScript禁用右键单击优缺点分析
Jan 20 Javascript
Vue 实现前端权限控制的示例代码
Jul 09 Javascript
vue中 数字相加为字串转化为数值的例子
Nov 07 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
简单示例AJAX结合PHP代码实现登录效果代码
2008/07/25 PHP
php array_merge函数使用需要注意的一个问题
2015/03/30 PHP
Yii框架数据模型的验证规则rules()被执行的方法
2016/12/02 PHP
php实现的简单中文验证码功能示例
2017/01/03 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
one.php 多项目、函数库、类库 统一为一个版本的方法
2020/08/24 PHP
深入分析js中的constructor和prototype
2012/04/07 Javascript
js跳转页面方法实现汇总
2014/02/11 Javascript
Jquery的each里用return true或false代替break或continue
2014/05/21 Javascript
原生JavaScript实现异步多文件上传
2015/12/02 Javascript
实例讲解JavaScript的Backbone.js框架中的View视图
2016/05/05 Javascript
JavaScript作用域示例详解
2016/07/07 Javascript
Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案
2017/03/13 Javascript
AngularJS实现的简单拖拽功能示例
2018/01/02 Javascript
Vue.js实现数据响应的方法
2018/08/13 Javascript
javascript和php使用ajax通信传递JSON的实例
2018/08/21 Javascript
详解JS转换数值函数Number()、parseInt()、parseFloat()
2018/08/24 Javascript
关于js陀螺仪的理解分析
2019/04/11 Javascript
ES6基础之字符串和函数的拓展详解
2019/08/22 Javascript
JS实现判断移动端PC端功能
2020/02/21 Javascript
VUE和Antv G6实现在线拓扑图编辑操作
2020/10/28 Javascript
完美解决Python2操作中文名文件乱码的问题
2017/01/04 Python
Python常用算法学习基础教程
2017/04/13 Python
Python3 单行多行万能正则匹配方法
2019/01/07 Python
Python closure闭包解释及其注意点详解
2019/08/28 Python
python快速排序的实现及运行时间比较
2019/11/22 Python
python sorted函数原理解析及练习
2020/02/10 Python
python 比较字典value的最大值的几种方法
2020/04/17 Python
基于PyQT实现区分左键双击和单击
2020/05/19 Python
使用keras时input_shape的维度表示问题说明
2020/06/29 Python
Html5 video标签视频的最佳实践
2020/02/26 HTML / CSS
美国新娘礼品店:The Paisley Box
2020/09/08 全球购物
《晏子使楚》教学反思
2014/02/08 职场文书
竞争上岗实施方案
2014/03/21 职场文书
2014年销售工作总结范文
2014/12/01 职场文书
2019年新郎保证书3篇
2019/10/17 职场文书