原文地址:js callee,caller学习

/*
* caller 返回一个对函数的引用,该函数调用了当前函数。
* 如果函数是由顶层调用的,那么 caller包含的就是 null 。
* 如果在字符串上下文中使用 caller属性,那么结果和 functionName.toString
* 一样,也就是说,显示的是函数的反编译文本。

* 在一个函数调用另一个函数时,被调用函数会自动生成一个caller属性,指向调用它的函数对象。如果该函数当前未被调用,或并非被其他函数调用,则caller为null。

*/

function callerDemo() {
if (callerDemo.caller) {
// var a= callerDemo.caller.toString();
// alert(a);
//等价于下面表达式
alert(callerDemo.caller);
} else {
alert("this is a top function");
}
}
function handleCaller() {
callerDemo();
}
// handleCaller();
// callerDemo();

  

/*-------------------------------------------------------
* callee 返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文。
* callee属性是 arguments 对象的一个成员,它表示对函数对象本身的引用,
* 这有利于匿名函数的递归或者保证函数的封装性
* 该属性仅当相关函数正在执行时才可用
* arguments.length是实参长度,arguments.callee.length是形参长度,
* 由此可以判断调用时形参长度是否和实参长度一致。
*/

function calleeDemo() {
// alert(n);
// arguments.callee(n-1);
alert(arguments.callee);
}
// calleeDemo(); //返回函数toString形式 //递归计算
var sum = function(n){
if (n <= 0)
return 1;
else
return n + arguments.callee(n - 1);
// arguments.callee调用当前正在执行的函数,即sum本身!
}
// alert(sum(3));

  

/*----------------------------------------
* 二者区别
*/

function inner(){
alert(arguments.callee);//指向拥有这个arguments对象的函数,即inner()
alert(arguments.callee.caller);//这个属性保存着调用当前函数的函数的引用,即outer()
}
function outer(){
inner();
}
// outer();//先弹出inner()函数再弹出outer()函数本身内容!

参考:理解JavaScript中的arguments,callee,caller,apply

JavaScript 之arguments、caller 和 callee 介绍