callee和caller

    callee是arguments的一个属性,这个属性指向函数的入口地址。arguments是js函数调用时存储函数参数的一个对象(注意是对象不是数组,可以在函数内部使用instanceof Array 来判定)。

    caller是当一个函数A调用另一个函数B时,函数B这个对象的一个属性,这个属性指向函数A。而A的caller为null。

    callee在递归函数中的好处:

    正常定义斐波那契函数如下(例子引自于《javascript高级程序设计》第七章匿名函数7.1节-递归):

function factorial(num) {
    if (num < 1) {
        return 1;
    } else {
        return num * factorial(num - 1);
    }
}

    基于上述函数,如果存在如下写法:

var f = factorial;
factorial = null;
alert(f(4));

   将函数引用赋值给f,再将factorial赋值为null。这样在f(4)执行时,函数内部的factorial由于被赋值为null,将导致报错。而如下的写法,采用arguments.callee将避免这个问题:

function factorial(num) {
    if (num < 1) {
        return 1;
    } else {
        return num * arguments.callee(num - 1);
    }
}
   这里由于arguments.callee指向函数的入口地址,代替了函数名称,保证了递归函数的稳定性。


 

阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页