讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議56:使用arguments模擬重載 >

建議56:使用arguments模擬重載

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