call caller callee 讲解

call方法
obj1.call(obj2, argument1, argument2...)

对于call方法有两组参数, 首先第一个是所要指代的对象, 第二组则是自身所需要的参数 在obj1中, obj2会成为obj1的this
(也可以理解为赋值 : obj1.this = obj2)

这样obj1就可以调用obj2的方法和属性了 换句话说 就是继承

 function add(a,b)
 {
 	console.log(this.age);
     this.speak(a,b);
 }

 var James = new Object;
 James.age = "18 years old";
 James.speak=function(a,b){
 	console.log("my name is James");
 	console.log("and I know "+a+"+"+b+"="+(a+b));
 }

输出

  add.call(James,6,6);		//18 years old
  							//my name is James
                             //and I know 6+6=12

caller属性
obj.caller

caller返回一个对函数的引用,该函数调用了当前函数。

通常caller也会与toString()方法进行适用,来调试输出上级函数

function callerDemo() {
        if (callerDemo.caller) {
                var a= callerDemo.caller.toString();
                console.log(a);
        } else {
                console.log("this is a top function");
        }
}
function handleCaller() {
        callerDemo();
}

handleCaller();				//function handleCaller() {callerDemo();}
callerDemo();				//this is a top function

callee属性
obj.callee

callee返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文。

对于匿名函数,callee方法可以实现其对自身的调用,从而实现递归(使匿名函数没有名字照样能被调用,不过是自己调用自己)

例1

function fact(n){
if(n<=0){
	return 1;
}else{
	return n*arguments.callee(n-1);  //轻松实现递归调用
}
}

console.log("4!="+fact(4))			//输出4!=24

obj.callee.length

callee属性也有length属性,可输出形参长度

不同于argument.length所代表的实参长度,callee.length输出实际输入的参数长度,利用这点可以对输入的参数(长度)进行验证

例2

function calleeLengthDemo(arg1, arg2) {
    if (arguments.length==arguments.callee.length) {
            console.log("验证形参和实参长度正确!");
            return;
    } else {
            console.log("实参长度:" +arguments.length);
            console.log("形参长度: " +arguments.callee.length);
    }
}

     calleeLengthDemo(1,2,3)				//实参长度:3 形参长度: 2
     calleeLengthDemo(1,2)					//验证形参和实参长度正确!