callee则不是函数对象的属性,它是函数上下文中arguments对象的属性
function func() {
alert(arguments.callee);
}
它引用的是函数自身,在上面的代码中,arguments.callee引用的就是func函数本身。既然他引用的是函数本身,那么似乎显得有点多余,当我们需要在函数体内使用函数本身时,直接通过函数名调用就可以了,干嘛还要多此一举的通过arguments.callee这样去调用。然而我觉得callee存在的意义可能是想解耦函数本身对函数名称的依赖吧, 比如说在递归的环境下,函数内部通常还要调用函数本身, 而调用函数本身就免不了硬编码函数名称, 如果函数名称有变化, 那么函数中的代码也需要修改,使用callee就可以避免此类情况。
function factorial( num ) {
if( num == 1 ) {
return 1;
}
let result = num * factorial(num - 1);
return result;
}
alert(factorial(100));
上面的阶乘函数通过callee可以改造成
function factorial( num ) {
if( num == 1 ) {
return 1;
}
let result = num * arguments.callee(num - 1);
return result;
}
alert(factorial(100));
如此同样实现递归, 但是可以做到函数体不依赖函数名称