arguments.callee Function.callee arguments.caller总结

Posted xiaokeai0110

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了arguments.callee Function.callee arguments.caller总结相关的知识,希望对你有一定的参考价值。

arguments.callee

arguments主要用途是保存函数参数,但这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个argumens对象的函数。

arguments.callee在解决递归的函数名问题时,有很大的作用。

下面是一个很经典的递归阶乘函数

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

但是下面的代码会让它出错:

var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(4));//报错

因为调用anotherFactorial的时候,内部需要再次调用factorial,然而factorial已被置于null。

那么,我们使用arguments.callee指向factorial函数本身,消除这种紧密的耦合,则可以实现了。并且这个方法在需要改动函数名的时候,还可以减少代码的修改量。

function factorial(num) {
  if (num<=1) {
    return 1;
  }else {
    return num*arguments.callee(num-1);
  }
}

但是在严格模式下,不能通过脚本访问arguments.callee,还可以使用命名函数表达式达成上述相同的效果:

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

Function.caller

这个属性保存着调用当前函数的函数的引用 ,如果是在全局作用域中调用当前函数,它的值为null。

function inner() {
   console.log(inner.caller); //打印出outer函数
}
function outer() {
  inner();
}
outer();
function inner() {
   console.log(arguments.callee.caller); //同样打印出outer函数
}
function outer() {
  inner();
}
outer();

arguments.caller

已过时,严格模式下访问它会导致错误,非严格模式下这个属性始终是undefined。它用来表示调用当前正在执行的函数的函数。MDN上显示此属性已被删除,不再有效。

 

 

end

以上是关于arguments.callee Function.callee arguments.caller总结的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript中的arguments,callee,caller

我对arguments.callee的理解

arguments.callee的用法

js的隐含参数(arguments,callee,caller)使用方法

arguments.callee用法

为啥 arguments.callee 会损害性能?