天天看點

arguments.callee的用法

argument為函數内部對象,包含傳入函數的所有參數,arguments.callee代表函數名,多用于遞歸調用,防止函數執行與函數名緊緊耦合的現象,對于沒有函數名的匿名函數也非常起作用。舉例如下:

function factorial(num){
      if(num<=1){
          return 1;
      }else{
          return num*arguments.callee(num-1);  //arguments.callee代表factorial
      }
}
var trueFactorial = factorial;
factorial = function(){
    return 0;
}
alert(trueFactorial(5)); //結果為120,因為js中函數沒有重載,是以如果遞歸調用時使用函數名,則執行最後一個該函數名的函數,即傳回0
alert(factorial(5));//結果為0      
var num = (function(num){
      if(num<=1){
          return 1;
      }else{
          return num*arguments.callee(num-1);
      }
 })(5);
  alert(num); //結果為120      
function showRed(fn1,){
    var f = arguments.callee; //函數本身
    //arguments.callee 執行該函數的上下文執行環境,指向調用他的對象
    setTimeout(function(){
        console.log("紅燈");
        fn1(fn2, f);
    }, 2000);   
}

function showYellow(fn1,){
    var f = arguments.callee;
    setTimeout(function(){
        console.log("黃燈");
        fn1(fn2, f);
    }, 1000);
    
}

function showGreen(fn1,){
    var f = arguments.callee;
    setTimeout(function(){
        console.log("綠燈");
        fn1(fn2, f);
    }, 3000);
}

showRed(showYellow, showGreen);