javascript中caller和callee详解


Posted in Javascript onAugust 10, 2015

最近学习javascript,碰到caller和callee的问题,去网上百度了很多。搜到的内容大同小益,整理总结了一下与大家分享。

caller:返回一个对调用function函数的函数的引用(用法:function.caller)

说明:对于函数来说,caller属性只有在函数执行时才有定义。如果函数由顶层调用,caller则为null。

var time = 3 //控制次数,去掉会一直在caller与handleCaller交替不断执行
function caller() {
  caller.caller()//返回调用caller函数的函数引用
}
function handleCaller() {
  if (time > 0){
    time--
    alert(handleCaller.caller)//返回调用handleCaller函数的函数引用
    alert(caller.caller)//返回调用caller函数的函数引用
    caller()
  }
}
handleCaller()

例子分析:第一次handleCaller运行的时候,两个alert返回的都是null,alert(handleCaller.caller)返回null是因为它是由顶层调用, alert(caller.caller)返回null是因为caller的默认值是null。接下去caller()函数被调用,caller.caller返回的是调用它的函数(handleCaller)的引用,通过caller.caller()可以再次调用handleCaller函数。第二次handleCaller运行的时候,alert(handleCaller.caller)返回的是caller代码(其实就是caller的引用),alert(caller.caller)返回的是handleCaller代码。因为函数之间的调用关系是handleCaller->caller->handleCaller。之后就不断在2个函数之间交替执行。

caller指向调用当前函数的函数,但是有一点,如果是在全局作用域内(即顶层window)被调用,则返回null。
代码走起

====================
function testCaller(){
if(testCaller.caller == null){
console.log('accessed at global');
}else{
console.log('accessed at ' + testCaller.caller);
}
}

在全局调用

testCaller(); // accessed at global

在一个函数中调用

function a(){
testCaller();
}
a(); // accessed at function a(){testCaller();}

此时,testCaller.caller指向就是 function a

callee:返回相对应的arguments的函数引用。(多用于匿名函数递归)

说明:也许你在网上看到最多的是callee返回正在执行的函数引用。我是这么理解,每个函数都有一个自己的arguments,通常是用来存放参数的。arguments有一个callee 属性,初始值就是对应自身的函数引用。当你函数执行到该语句时,arguments是默认对应的是你现在执行的函数,那么arguments.callee为当前正在执行的函数的引用。当然如果你有标记过其他函数的arguments(例子中的args),自然可以用args.callee()去再次调用那个函数。

function a(){
  alert(arguments.callee)
  var args = arguments
  function c(){
    alert(arguments.callee)
    args.callee()
  }
  c()
}
a()

例子分析:例子中的arguments.callee都是默认返回当前正在执行的函数的引用(a中返回a自身函数引用,c中返回c自身函数引用),而通过用args存放a函数的arguments,在内置函数c中使用args.callee()再次调用a函数。

====================
function a(x){

if(x<=1)
return x;
else
return x + a(x-1);
}
a(12) // 78

这是一个极简的递归,运行结果正常。

再看看下面的调用方法

var b = a;
a = null; // 将a回收
b(12); // erro : 'a' is not a function

原因也简单,b=a,b=function a(){};在b调用之前,我们用了a=null。所以在 function a 运行的时候,其中的return x + a(x-1);中的a,指向的就是null,而不是 function a。
所以就报错了,如何解决这样的问题。我们将a换一种写法

function a(x){
if(x<=1)
return x;
else
return arguments.callee(x-1); // 这句是改变的地方
}

再调用

var b = a;
a = null;
b(12); // 78

原因:虽然我们将a=null了,但是函数a中并没有用到a,而是通过arguments.callee指向当前函数。
因为arguments.callee的定义就是:返回正在执行的函数。

Javascript 相关文章推荐
用JavaScript获取网页中的js、css、Flash等文件
Dec 20 Javascript
JavaScript库 开发规则
Jan 31 Javascript
一步一步教你写一个jQuery的插件教程(Plugin)
Sep 03 Javascript
js实现DOM走马灯特效的方法
Jan 21 Javascript
jqueryMobile使用示例分享
Jan 12 Javascript
完美解决jQuery fancybox ie 无法显示关闭按钮的问题
Nov 29 Javascript
Bootstrap CSS组件之按钮组(btn-group)
Dec 17 Javascript
js遍历json的key和value的实例
Jan 22 Javascript
Bootstrap栅格系统使用方法及页面调整变形的解决方法
Mar 10 Javascript
Vue应用部署到服务器的正确方式
Jul 15 Javascript
微信web端后退强制刷新功能的实现代码
Mar 04 Javascript
微信小程序车牌号码模拟键盘输入功能的实现代码
Nov 11 Javascript
jQuery实现购物车表单自动结算效果实例
Aug 10 #Javascript
javascript中$(function() {});写与不写有哪些区别
Aug 10 #Javascript
jQuery中$(function() {});问题详解
Aug 10 #Javascript
jquery实现鼠标滑过后动态图片提示效果实例
Aug 10 #Javascript
jQuery模拟原生态App上拉刷新下拉加载更多页面及原理
Aug 10 #Javascript
jQuery 判断图片是否加载完成方法汇总
Aug 10 #Javascript
javascript实现连续赋值
Aug 10 #Javascript
You might like
咖啡因含量是由谁决定的?低因咖啡怎么来?低因咖啡适合什么人喝
2021/03/06 新手入门
解决PHP超大文件下载,断点续传下载的方法详解
2013/06/06 PHP
PHP实现过滤各种HTML标签
2015/05/17 PHP
PHP会员找回密码功能的简单实现
2016/09/05 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
JavaScript 密码强度判断代码
2009/09/05 Javascript
最新的10款jQuery内容滑块插件分享
2011/09/18 Javascript
jquery ajax,ashx,json的用法总结
2014/02/12 Javascript
获取中文字符串的实际长度代码
2014/06/05 Javascript
jQuery实现的一个tab切换效果内部还嵌有切换
2014/08/10 Javascript
jquery checkbox 勾选的bug问题解决方案与分析
2014/11/13 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
设置jQueryUI DatePicker默认语言为中文
2016/06/04 Javascript
轻松掌握JavaScript单例模式
2016/08/25 Javascript
对比分析Django的Q查询及AngularJS的Datatables分页插件
2017/02/07 Javascript
React Native中的RefreshContorl下拉刷新使用
2017/10/09 Javascript
vue.js轮播图组件使用方法详解
2018/07/03 Javascript
Vue仿微信app页面跳转动画效果
2019/08/21 Javascript
javascript实现切割轮播效果
2019/11/28 Javascript
JSONObject与JSONArray使用方法解析
2020/09/28 Javascript
解决Ant Design Modal内嵌Form表单initialValue值不动态更新问题
2020/10/29 Javascript
Python的Flask框架与数据库连接的教程
2015/04/20 Python
Python守护线程用法实例
2017/06/23 Python
python os.path.isfile()因参数问题判断错误的解决
2019/11/29 Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
2020/02/29 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
英国排名第一的冲浪店:Ann’s Cottage
2020/06/21 全球购物
网络信息管理员岗位职责
2014/01/05 职场文书
新任教师自我鉴定
2014/02/24 职场文书
小学生春游活动方案
2014/08/20 职场文书
股东合作协议书
2014/09/12 职场文书
承诺函范文
2015/01/21 职场文书
Python读取文件夹下的所有文件实例代码
2021/04/02 Python
Java数组与堆栈相关知识总结
2021/06/29 Java/Android
详解MySql中InnoDB存储引擎中的各种锁
2022/02/12 MySQL