javascript中caller和callee详解

作者:hebedich 时间:2024-04-29 13:38:05 

最近学习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,caller,callee
0
投稿

猜你喜欢

  • MySql数据库基本命令集会

    2011-08-05 18:43:23
  • 一篇文章搞懂python混乱的切换操作与优雅的推导式

    2023-09-15 00:25:10
  • 自动备份mssql server数据库并压缩的批处理脚本

    2024-01-24 00:30:11
  • Django models.py应用实现过程详解

    2021-07-18 11:11:08
  • MySQL更新存放JSON的字段、\\“ 转义成 “的问题描述

    2024-01-13 16:30:00
  • Python字典遍历的陷阱

    2022-11-16 21:59:11
  • 正则表达式不匹配某个字符串

    2010-03-02 22:08:00
  • python 协程并发数控制

    2023-09-20 01:07:10
  • Python实现简单2048小游戏

    2023-08-13 00:19:18
  • 使用Python的Bottle框架写一个简单的服务接口的示例

    2023-09-01 17:29:50
  • asp图片加水印的功能代码

    2011-02-05 11:02:00
  • Python常用图像形态学操作详解

    2023-07-27 18:14:51
  • DIV+CSS常见错误及解决方法

    2008-04-25 22:46:00
  • flask 实现上传图片并缩放作为头像的例子

    2021-09-08 06:32:42
  • 微信小程序下载工具及调试详解

    2022-10-30 09:06:05
  • python连接mongodb集群方法详解

    2021-08-26 11:45:08
  • Python机器学习工具scikit-learn的使用笔记

    2021-08-30 10:28:50
  • python3中替换python2中cmp函数的实现

    2021-08-15 01:42:41
  • python高并发异步服务器核心库forkcore使用方法

    2021-12-04 18:38:24
  • Python调用ChatGPT制作基于Tkinter的桌面时钟

    2023-05-11 08:23:23
  • asp之家 网络编程 m.aspxhome.com