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);