每一個 Javascript 函數都能在自己作用域內存取一個特殊的變數 - arguments。這個變數含有一個傳遞給函數的所有參數的列表。
arguments 物件不是一個陣列。儘管在語法上它跟數組有相同的地方,例如它擁有 length 屬性。但它並不是從 Array.prototype 繼承而來,實際上,它就是一個物件。
因此,我們不能直接對 arguments 使用一些陣列的方法,例如 push, pop 或 slice 等。 所以為了使用這些方法,我們需要將其轉換為一個真正的陣列。
轉換為陣列
下面的程式碼將會傳回一個包含 arguments 物件所有元素的陣列。
Array.prototype.slice.call(arguments);
由於轉換的速度很慢,所以在效能要求嚴格的程序中不建議這樣做。
傳遞參數
以下是一種比較推薦的方法,將 arguments 物件從一個函數傳遞到另一個函數。
另外還有一個比較巧妙的方法,就是同時使用 call 和 apply 快速建立一個解綁的外層方法。
函數形參與 arguments 屬性的關係
arguments 物件為它自身屬性和函數的形參都創建了 getter 和 setter 方法。
因此,修改函數的形參會影響對應的 arguments 物件的屬性值,反之亦然。
效能問題
arguments 只在兩種情況下不會被創建,一是在函數內部被宣告為局部變量,二是當做函數的形參。其他情況,arguments 物件總是會被建立。
由於 getter 和 setter 方法總是會隨著 arguments 物件的創建而創建,因此使用 arguments 對效能本身幾乎沒有影響。
然而,有一種情況會嚴重影響 Javascript 的效能,那就是使用 arguments.callee。
在上述程式碼中,foo 函數不再是一個簡單的內聯擴展,因為它需要知道它本身以及它的呼叫者(caller)。這不僅抵消了內聯擴展所帶來的效能提升,同時也破壞了函數的封裝性,因為函數本身可能需要依賴一個特定的呼叫背景。
因此,建議大家盡量不要使用 arguments.callee。
以上就是關於Javascript arguments 物件的全部內容了,小夥伴們是否了解透徹呢,簡單的說
arguments指函數的參數物件(指實際傳入的參數)
arguments.length指函數的參數物件的長度
arguments[i]指第i個參數的值(第一個為0)