arguments中的caller与callee

arguments中有两个好用的属性,caller与callee,中文意思为呼叫者和被呼叫者。那么,这两个属性,究竟是啥?

呼叫者caller

含义:返回当前调用该属性的方法的方法

有点绕口,详细点就是:如果一个方法里面,调用了caller,那么caller就返回调用这个方法的方法,如果这个方法是由顶级(浏览器端为window)调用的,则返回undefined。

我们来举个例子

function f1(){
    console.log(arguments.caller);
}

function f2(){
    f1();
}

f1();//undefined
f2();//function f2(){ f1();}

caller在每次函数执行的时候都会重新执行。

这个特性意味着caller可以用来显示函数的反编译文本。

被呼叫者callee

含义:返回当前调用该属性的方法

这个好理解,就是返回调用函数本身。

还是来看看例子

function f1(){
    console.log(arguments.callee);
}
f1(); //function f1(){ ...}

利用callee我们可以轻松实现很多功能,例如递归:

function fact(n){
    if(n<=0){
        return 1;
    }else{
        return n*arguments.callee(n-1);  
    }
}

或者检验实参与形参个数是否相同:

function f4(x,y,z){
    if(arguments.length === arguments.callee.length){
        console.log('实参形参个数相同');
    }else{
        console.log('实参形参个数不同');
    }
}
f4(1,2);//实参形参个数不同
f4(1,2,3);//实参形参个数相同

还有其他功能,有待挖掘。