递归

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

// 问题
var anotherFactorial = factorial;
factorial = null;
anotherFactorial(); // 报错

非正式的解决方案 arguments.callee

arguments.callee 是一个指向正在执行的函数的指针

function factorial(num){
  if (num <= 1) {
    return 1;
  } else {
    return num * arguments.callee(num-1);     
  }
}
注意: 在严格模式下会导致错误,并且auguments是个很大的对象,频繁创建会造成浏览器性能损耗

终极解决方案

申明一个函数,添加函数名称,调用此函数名称就可以

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

listenWind
271 声望3 粉丝