我是靠谱客的博主 兴奋大山,最近开发中收集的这篇文章主要介绍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

作者:zqifa

出处:https://www.l1mn.com

最后

以上就是兴奋大山为你收集整理的js中caller和callee属性详解的全部内容,希望文章能够帮你解决js中caller和callee属性详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部