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()函数本身内容!

 

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

JavaScript 之arguments、caller 和 callee 介绍

你可能感兴趣的:(call)