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图像处理思路及实现代码
Dec 25 Javascript
js解析与序列化json数据(一)json.stringify()的基本用法
Feb 01 Javascript
node.js操作mysql(增删改查)
Jul 24 Javascript
基于jquery实现鼠标左右拖动滑块滑动附源码下载
Dec 23 Javascript
深入理解JQuery循环绑定事件
Jun 02 Javascript
JavaScript性能优化总结之加载与执行
Aug 11 Javascript
Bootstrap栅格系统的使用和理解2
Dec 14 Javascript
node.js中EJS 模板快速入门教程
May 08 Javascript
npm 更改默认全局路径以及国内镜像的方法
May 16 Javascript
js for终止循环 跳出多层循环
Oct 04 Javascript
微信小程序自定义可滑动日历界面
Dec 28 Javascript
解决iView Table组件宽度只变大不变小的问题
Nov 13 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
COM in PHP (winows only)
2006/10/09 PHP
php 分库分表hash算法
2009/11/12 PHP
php操作redis中的hash和zset类型数据的方法和代码例子
2014/07/05 PHP
PHP中cookie和session的区别实例分析
2014/08/28 PHP
PHP发送AT指令实例代码
2016/05/26 PHP
PHP邮箱验证示例教程
2016/06/01 PHP
PHP实现八皇后算法
2019/05/06 PHP
jquery中eq和get的区别与使用方法
2011/04/14 Javascript
jQuery 对Select的操作备忘记录
2011/07/04 Javascript
Javascript图像处理—平滑处理实现原理
2012/12/28 Javascript
JavaScript 上万关键字瞬间匹配实现代码
2013/07/07 Javascript
浅谈JavaScript之事件绑定
2013/07/08 Javascript
javascript实现验证身份证号的有效性并提示
2015/04/30 Javascript
JavaScript+html5 canvas绘制缤纷多彩的三角形效果完整实例
2016/01/26 Javascript
Javascript实现前端简单的路由实例
2016/09/11 Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
2016/11/30 Javascript
jQuery实现百度登录框的动态切换效果
2017/04/21 jQuery
Javascript实现运算符重载详解
2018/04/07 Javascript
JS中min函数实例讲解
2019/02/18 Javascript
原生JS实现相邻月份日历
2020/10/13 Javascript
JavaScript实现浏览器网页自动滚动并点击的示例代码
2020/12/05 Javascript
python安装numpy&amp;安装matplotlib&amp; scipy的教程
2017/11/02 Python
详解如何为eclipse安装合适版本的python插件pydev
2018/11/04 Python
Python代码打开本地.mp4格式文件的方法
2019/01/03 Python
python flask安装和命令详解
2019/04/02 Python
Django模板标签中url使用详解(url跳转到指定页面)
2020/03/19 Python
俄罗斯购买内衣网站:Trusiki
2020/08/22 全球购物
Ajax的优点和缺点
2014/11/21 面试题
GWT都有什么特性
2016/12/02 面试题
小学教研工作制度
2014/01/15 职场文书
《月光启蒙》教学反思
2014/03/01 职场文书
大二学生学年自我鉴定
2014/09/12 职场文书
八项规定整改方案
2014/10/01 职场文书
《珍珠鸟》教学反思
2016/02/16 职场文书
浅谈克隆 JavaScript
2021/11/02 Javascript
Python PIL按比例裁剪图片
2022/05/11 Python