天天看點

JS程式設計建議——58:靈活使用Arguments

建議58:靈活使用Arguments

JavaScript函數的參數是不固定的,調用函數時傳遞給它的實參也很随意,為了有效管理參數,JavaScript支援Arguments機制。

Arguments是一個僞數組,可以通過數組下标的形式擷取該集合中傳遞給函數的參數值。例如,在下面這個函數中,沒有指定形參,但在函數體内通過Arguments對象可以擷取傳遞給該函數的每個實參值。

function f(){

}

f(3, 3, 6);

Arguments對象僅能夠在函數體内使用,它僅作為函數體的一個私有成員而存在,是以可以通過點号運算符來指定Arguments對象所屬的函數。由于Arguments對象在函數體内是唯一的和可指向的,是以一般會省略前置路徑,直接引用Arguments對象的調用辨別符arguments。

通過數組的形式來引用Arguments對象包含的實參值,如arguments[i],其中arguments表示對Arguments對象的實際引用,變量i是Arguments對象集合的下标值,從0開始,直到arguments.length(其中length是Arguments對象的一個屬性,表示Arguments對象包含的實參的個數)。

由于Arguments不是Array的執行個體,是以不能夠直接調用數組的方法,但通過call或apply方法能夠間接實作調用數組的部分方法。

Arguments對象中的每個元素實際上就是一個變量,這些變量用來存儲調用函數時傳遞的實參值。通過arguments[]數組和已經命名的形參可以引用這些變量的值。使用Arguments對象可以随時改變實參的值。例如,在下面這個示例中把循環變量的值傳遞給Arguments對象元素,以實作動态改變實參的值。

f(3, 3, 6); //提示1、2、3,而不是3、3、6

通過修改Arguments對象的length屬性值,可以達到改變函數實參個數的目的。當length屬性值增大時,增加的實參值為undefined,當length屬性值減小時,則會丢棄arguments資料集合後面對應個數的元素。

Arguments在實際開發中具有重要的價值,使用它可以監測使用者在調用函數時所傳遞的參數是否符合要求,增強函數的容錯能力,同時還可以開發出很多功能強大的函數。

如果要定義的函數參數個數不确定,或者參數個數很多,又不想為每個參數都定義一個變量,此時定義函數可以保留參數清單為空,在函數内部使用Arguments對象來通路調用函數時傳遞的所有參數。下面這個示例就是利用Arguments對象來計算函數任意多個參數的平均值。

function avg(){

alert(avg(1, 2, 3, 4)); //2.5

alert(avg(1, 2, "3", 4)); //2.3333333333333335

表單驗證是頁面設計中經常要完成的任務,下面的示例驗證所輸入的值是否符合郵箱位址格式。

function isEmail(){

((.|-)[A-Za-z0-9]+)*.[A-Za-z0-9]+$/;

var email = "[email protected]";

alert(isEmail(email)); //true

Arguments對象包含一個callee屬性,它能夠傳回目前Arguments對象所屬的函數引用,這相當于在函數體内調用函數自身。在匿名函數中,callee屬性比較有用,通過它在函數内部引用函數自身。

在下面這個示例中,通過arguments.callee擷取對目前匿名函數的引用,然後通過函數的length屬性确定它的形參個數。最後,通過實參和形參數目的比較來确定傳遞的參數是否合法。

function f(x, y, z){

alert(f(3, 4, 5)); //值為12

Function對象的length屬性傳回的是函數的形參個數,而Arguments對象的length屬性傳回的是函數的實參個數。如果函數不是匿名函數,則arguments.callee等價于函數名。

繼續閱讀