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 Select操作大集合
May 26 Javascript
javascript中callee与caller的用法和应用场景
Dec 08 Javascript
JS随即打乱数组实现代码
Dec 03 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
Sep 18 Javascript
jQuery控制TR显示隐藏的三种常用方法
Aug 21 Javascript
JavaScript中提前声明变量或函数例子
Nov 12 Javascript
Bootstrap表格制作代码
Mar 17 Javascript
深入理解JavaScript 中的匿名函数((function() {})();)与变量的作用域
Aug 28 Javascript
详解vue.js移动端配置flexible.js及注意事项
Apr 10 Javascript
JS实现图片切换特效
Dec 23 Javascript
微信小程序静默登录的实现代码
Jan 08 Javascript
webpack.DefinePlugin与cross-env区别详解
Feb 23 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
php使用curl检测网页是否被百度收录的示例分享
2014/01/31 PHP
PHP中isset与array_key_exists的区别实例分析
2015/06/02 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
得到文本框选中的文字,动态插入文字的js代码
2007/03/07 Javascript
基于jquery的Repeater实现代码
2010/07/17 Javascript
JavaScript将页面表格导出为Excel的具体实现
2013/12/27 Javascript
ajax的分页查询示例(不刷新页面)
2017/01/11 Javascript
浅谈angular4 ng-content 中隐藏的内容
2017/08/18 Javascript
AngularJS实现的生成随机数与猜数字大小功能示例
2017/12/25 Javascript
Node.js实现注册邮箱激活功能的方法示例
2018/03/23 Javascript
使用Angular自定义字段校验指令的方法示例
2019/02/01 Javascript
基于javascript的拖拽类封装详解
2019/04/19 Javascript
Vue 中 template 有且只能一个 root的原因解析(源码分析)
2020/04/11 Javascript
vue+axios全局添加请求头和参数操作
2020/07/24 Javascript
Python科学计算环境推荐——Anaconda
2014/06/30 Python
Python map和reduce函数用法示例
2015/02/26 Python
Python多进程并发(multiprocessing)用法实例详解
2015/06/02 Python
Python实现的购物车功能示例
2018/02/11 Python
python破解bilibili滑动验证码登录功能
2019/09/11 Python
10个Python面试常问的问题(小结)
2019/11/20 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
python使用pyecharts库画地图数据可视化的实现
2020/03/25 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
2021/03/02 Python
董事长岗位职责
2013/11/30 职场文书
建筑人员岗位职责
2013/12/25 职场文书
企业军训感言
2014/02/08 职场文书
婚假请假条格式及范文
2014/04/10 职场文书
班风口号
2014/06/18 职场文书
优秀教师事迹材料
2014/12/15 职场文书
客户答谢会致辞
2015/01/20 职场文书
原料仓管员岗位职责
2015/04/01 职场文书
英文投诉信格式
2015/07/03 职场文书
nginx proxy_cache 缓存配置详解
2021/03/31 Servers
Python中相见恨晚的技巧
2021/04/13 Python
HTML5来实现本地文件读取和写入的实现方法
2021/05/25 HTML / CSS
MyBatis核心源码深度剖析SQL语句执行过程
2022/05/20 Java/Android