3.7函數 3.7.1 理解參數 arguments對象與命名參數的關係: 3.7.2 沒有重載 沒有重載 模擬重載
3.7函數
3.7.1 理解參數
- ECMAScript 函數不介意傳遞進來多個參數,也不在乎傳遞進來的參數是什麼數據類型。因為在 ECMAScript 中的參數在內部是用一個數組來表示的。在函數體內可以通過arguments對象來訪問這個參數數組,從而獲取傳遞給函數的每一個參數。
- 命名的參數只提供便利,但不是必需的。
- arguments 對象可以與命名參數一起使用。
- arguments對象的值永遠與對應命名參數的值保持同步。不過,這並不是說讀取這兩個值會訪問相同的記憶體空間。它們的記憶體空間是獨立的,但它們的值會同步。
- arguments對象的長度有傳入的參數的個數決定,不是由定義函數時的命名參數的個數決定的。沒有傳遞值的命名參數將自動被賦予undefined值。
- ECMAScript 中所有的參數傳遞的都是值,不可能通過引用傳遞參數。
arguments對象與命名參數的關係:
1 function say_hello(var1, var2, var3) { 2 var len = arguments.length; 3 alert(len); 4 for (i in arguments) { 5 alert(arguments[i]); 6 } 7 alert(var1); 8 alert(var2); 9 alert(var3); 10 } 11 12 say_hello(); //0, undefined, undefined, undefined 13 say_hello("first"); // 1, first, first, undefined, undefined 14 say_hello("first", "second", "third"); // 3, first, second, third, first, second, third 15 say_hello("first", "second", "third", "forth");// 4, first, second, third, forth, first, second, third
1 function say_hello(var1, var2, var3) { 2 for (i in arguments) { 3 arguments[i] = "change"; 4 } 5 alert(var1 + var2 + var3); 6 } 7 8 say_hello(1,2,3); //changechangechange
3.7.2 沒有重載
- 沒有函數簽名,真正的重載是不可以做到的。
- 如果在ECMAScript中定義了兩個名字相同的函數,則該名字只屬於後定義的函數。
- 通過檢查傳入函數中參數的類型和數量並作出不同的反應,可以模擬方法的重載。
沒有重載
1 function overLoad (var1) { 2 alert("This is the first function"); 3 } 4 5 function overLoad(var1, var2) { 6 alert("This is the second function"); 7 } 8 9 overLoad(1); //This is the second function
模擬重載
1 function overLoad () { 2 if (arguments.length === 0) { 3 alert("first"); 4 } else if (arguments.length === 1) { 5 alert("second"); 6 } else { 7 alert("third"); 8 } 9 } 10 11 overLoad(); //first 12 overLoad(1); //second 13 overLoad(1,2,3,4); //third