原文地址:js callee,caller学习javascript
/*
* caller 返回一个对函数的引用,该函数调用了当前函数。
* 若是函数是由顶层调用的,那么 caller包含的就是 null 。
* 若是在字符串上下文中使用 caller属性,那么结果和 functionName.toString
* 同样,也就是说,显示的是函数的反编译文本。html
* 在一个函数调用另外一个函数时,被调用函数会自动生成一个caller属性,指向调用它的函数对象。若是该函数当前未被调用,或并不是被其余函数调用,则caller为null。java
*/app
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()函数自己内容!