在JavaScript中,每個函數內部可以使用arguments對象,該對像包含了函數被調用時的實際參數值。arguments對像雖然在功能上與數組有些類似,但它不是數組。arguments對象與數組的類似體現在它有一個length屬性,同時實際參數的值可以通過操作符來獲取,但arguments對象並沒有數組可以使用的push、pop、splice等方法。其原因是arguments對象的prototype指向的是Object.prototype,而不是Array.prototype。
Java和C++語言都支持方法重載,即允許出現名稱相同而形式參數不同的方法,但JavaScript並不支持這種方式的重載。這是因為JavaScript中的function對象也是以屬性的形式出現的,在一個對像中增加與已有function同名的新function時,舊的function對像會被覆蓋。不過可以通過使用arguments來模擬重載,其實現機制是通過判斷arguments中實際參數的個數和類型來執行不同的邏輯。
function sayHello{
switch(arguments.length){
case 0:
return"Hello";
case 1:
return"Hello,"+arguments[0];
case 2:
return(arguments[1]=="cn"?"你好,":"Hello,")+arguments[0];
};
}
sayHello;//"Hello"
sayHello("Alex");//"Hello,Alex"
sayHello("Alex","cn");//"你好,Alex"
callee是arguments對象的一個屬性,其值是當前正在執行的function對象。它的作用是使匿名function可以被遞歸調用。下面以一段計算斐波那契序列中第N個數的值的過程來演示arguments.callee的使用。
function fibonacci(num){
return(function(num){
if(typeof num!=="number")
return-1;
num=parseInt(num);
if(num<1)
return-1;
if(num==1||num==2)
return 1;
return arguments.callee(num-1)+arguments.callee(num-2);
})(num);
}
fibonacci(100);