js中caller和callee属性详解

一、caller属性
返回一个对函数的引用,该函数调用了当前函数。
functionName.caller
functionName 对象是所执行函数的名称。
说明
对于函数来说,caller 属性只有在函数执行时才有定义。 如果函数是由 Javascript 程序的顶层调用的,那么 caller 包含的就是 null 。
下面的例子说明了 caller 属性的用法:

 

复制代码
 1 function callerDemo() {
 2     if (arguments.caller) {
 3         var a= callerDemo.caller.toString();
 4         alert(a);
 5     } else {
 6         alert("this is a top function");
 7     }
 8 }
 9 function handleCaller() {
10     callerDemo();
11 }
12 handleCaller();
13 function calleeDemo() {
14      alert(arguments.callee);
15 }
16 calleeDemo();
复制代码

 

 

function callerDemo() {
if ( arguments.caller) {
var a= callerDemo.caller.toString();
alert(a);
} else {
alert("this is a top function");
}
}
function handleCaller() {
callerDemo();
}
handleCaller();
function calleeDemo() {
alert(arguments.callee);
}
calleeDemo();

二、callee属性
返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文。
[function.]arguments.callee
可选项 function 参数是当前正在执行的 Function 对象的名称。
说明
callee 属性的初始值就是正被执行的 Function 对象。
callee 属性是 arguments 对象的一个成员,它表示对函数对象本身的引用,这有利于匿名函数的递归或者保证函数的封装性,例如下边示例的递归计算1到n的自然数之和。而该属性仅当相关函数正在执行时才可用。还有需要注意的是callee拥有length属性,这个属性有时候用于验证还是比较好的。arguments.length是实参长度,arguments.callee.length是形参长度,由此可以判断调用时形参长度是否和实参长度一致。
示例代码:

 

复制代码
 1 //callee可以打印其本身
 2 function calleeDemo() {
 3      alert(arguments.callee);
 4 }
 5 //用于验证参数
 6 function calleeLengthDemo(arg1, arg2) {
 7     if (arguments.length==arguments.callee.length) {
 8          window.alert("验证形参和实参长度正确!");
 9         return;
10      } else {
11          alert("实参长度:" +arguments.length);
12          alert("形参长度: " +arguments.callee.length);
13      }
14 }
15 //递归计算
16 var sum = function(n){
17   if (n < = 0)                       
18   return 1;
19   else
20     return n +arguments.callee(n - 1)
21 }
复制代码

 

 

//callee可以打印其本身
function calleeDemo() {
alert(arguments.callee);
}
//用于验证参数
function calleeLengthDemo(arg1, arg2) {
if (arguments.length==arguments.callee.length) {
window.alert("验证形参和实参长度正确!");
return;
} else {
alert("实参长度:" +arguments.length);
alert("形参长度: " +arguments.callee.length);
}
}
//递归计算
var sum = function(n){
if (n < = 0)
return 1;
else
return n +arguments.callee(n - 1)
}

比较一般的递归函数:

 

1 var sum = function(n){
2         if (1==n) 
3             return 1;
4         else 
5             return n + sum (n-1);
6     }

 

 

var sum = function(n){
if (1==n)
return 1;
else
return n + sum (n-1);
}

调用时:alert(sum(100));
其中函数内部包含了对sum自身的引用,函数名仅仅是一个变量名,在函数内部调用sum即相当于调用
一个全局变量,不能很好的体现出是调用自身,这时使用callee会是一个比较好的方法。


PS:
1、不要随便用caller,这个属性是非标准的,支不支持全看各大浏览器的心情。
2、在chrome中arguments没有caller这个属性,在arguments.callee.caller中。所以关于caller的示例代码在chrome输出 this is a top function。可以用arguments.callee.caller代替

3、mdn参考资料:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments/callee

posted on   zqifa  阅读(1532)  评论(0编辑  收藏  举报

编辑推荐:
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
· Linux系列:如何调试 malloc 的底层源码
阅读排行:
· C# 中比较实用的关键字,基础高频面试题!
· .NET 10 Preview 2 增强了 Blazor 和.NET MAUI
· Ollama系列05:Ollama API 使用指南
· 为什么AI教师难以实现
· 如何让低于1B参数的小型语言模型实现 100% 的准确率

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示