js函数中使用callee

callee

是arguments对象的一个属性,然而在ES5开始就移除了,加入callee主要是为了解决存在匿名函数调用自身函数所引发的问题
1 这个属性只有在函数执行时才有效
2 它有一个length属性,可以用来获得形参的个数,因此可以用来比较形参和实参个数是否一致,即比较arguments.length是否等于arguments.callee.length
3 它可以用来递归匿名函数。
调用callee返回该函数,这就能在匿名函数中有递归的效果了eg:

[1,2,3].map(function(n){
  return !(n > 1) ? : arguments.callee(n - 1) * n;
}) 当然替代方案是在回调函数定义别名,再调用eg: [1,2,3].map(function factorial (n) {
    return !(n > 1) ? 1 : factorial(n-1)*n;
}); 1.该函数可以像代码内部的任何其他函数一样被调用 2.它不会在外部作用域中创建一个变量 (除了 IE 8 及以下) 3.它具有比访问arguments对象更好的性能

当然这种方式也是存在问题的,当在匿名函数中递归调用并且在使用this时eg:

var global = this;
var sillyFunction = function (recursed) {
    if (!recursed) { return arguments.callee(true); }
    if (this !== global) {
        alert("This is: " + this);
    } else {
        alert("This is the global");
    }
}
sillyFunction();

使用callee来实现阶乘eg:

function create() {
   return function(n) {
      if (n <= 1)
         return 1;
      return n * arguments.callee(n - 1);
   };
}
var result = create()(5); // returns 120 (5 * 4 * 3 * 2 * 1) 这种方式同样可以使用函数命名方式改写eg: function create() {
   return function temp(n) {
      if (n <= 1)
         return 1;
      return n * temp(n - 1);
   };
}
var result = create()(5); 
所以这只是另一种方式而已,不过现在还是不推荐使用callee了 

caller
caller 返回一个函数的引用,这个函数调用了当前的函数
1 这个属性只有当函数在执行时才有用
2 如果在javascript程序中,函数是由顶层调用的,则返回null

function a(){
  reutrn a.caller;
}
a() // null 函数由顶层调用
百度已收录
分享