js callee,caller学习
原文地址: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()函数本身内容!