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高级程序设计 阅读笔记(七) ECMAScript中的语句
Feb 27 Javascript
基于mootools插件实现遮罩层新手引导
May 24 Javascript
ExtJS DOM元素操作经验分享
Aug 28 Javascript
bootstrap输入框组件使用方法详解
Jan 19 Javascript
微信小程序左右滑动切换页面详解及实例代码
Feb 28 Javascript
原生JS实现图片网格式渐显、渐隐效果
Jun 05 Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
Sep 14 Javascript
使用JS实现导航切换时高亮显示的示例讲解
Aug 22 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
Dec 03 Javascript
js实现跟随鼠标移动的小球
Aug 26 Javascript
使用vue实现一个电子签名组件的示例代码
Jan 06 Javascript
quickjs 封装 JavaScript 沙箱详情
Nov 02 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 基本语法格式
2009/12/15 PHP
php学习之运算符相关概念
2011/06/09 PHP
php的array_multisort()使用方法介绍
2012/05/16 PHP
php实现使用正则将文本中的网址转换成链接标签
2014/12/03 PHP
mysql_connect localhost和127.0.0.1的区别(网络层阐述)
2015/03/26 PHP
php修改上传图片尺寸的方法
2015/04/14 PHP
Yii2 RESTful中api的使用及开发实例详解
2016/07/06 PHP
asp函数split()对应php函数explode()
2019/02/27 PHP
捕获关闭窗口的脚本
2009/01/10 Javascript
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
2011/03/05 Javascript
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
2011/04/12 Javascript
JS获取整个页面文档的实现代码
2011/12/15 Javascript
Prototype源码浅析 Enumerable部分(二)
2012/01/18 Javascript
使用Javascript简单实现图片无缝滚动
2014/12/05 Javascript
javascript实现表格排序 编辑 拖拽 缩放
2015/01/02 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
D3.js实现饼状图的方法详解
2016/09/21 Javascript
剖析Angular Component的源码示例
2018/03/23 Javascript
通过jquery获取上传文件名称、类型和大小的实现代码
2018/04/19 jQuery
详解vuejs中执行npm run dev出现页面cannot GET/问题
2020/04/26 Javascript
Antd的Table组件嵌套Table以及选择框联动操作
2020/10/24 Javascript
vue el-upload上传文件的示例代码
2020/12/21 Vue.js
[03:49]显微镜下的DOTA2第十五期—VG登基之路完美团
2014/06/24 DOTA
python实现汉诺塔方法汇总
2016/07/25 Python
Python 列表理解及使用方法
2017/10/27 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
2019/07/02 Python
PHP基于phpqrcode类库生成二维码过程解析
2020/05/28 Python
Top Villas美国:豪华别墅出租和度假屋
2018/07/10 全球购物
Hotels.com印度:酒店预订
2019/05/11 全球购物
ABOUT YOU匈牙利:500个最受欢迎的时尚品牌
2019/07/19 全球购物
旅游饭店管理专业自荐书
2014/06/28 职场文书
投资申请报告
2015/05/19 职场文书
心灵捕手观后感
2015/06/02 职场文书
七年级思品教学反思
2016/02/20 职场文书
2019年大学生职业生涯规划书
2019/03/25 职场文书
解决Tkinter中button按钮未按却主动执行command函数的问题
2021/05/23 Python