在 JavaScript 中,一切都是對象,連函數也是對象,函數名其實是引用函數定義對象的變量。
arguments 是對象的一個特殊屬性,是所在函數的一個內置類數組對象。
arguments 對象就像數組,但是它卻不是數組。以數組的形式保存了調用方給該函數傳入的所有參數。
屬性:
length:獲取arguments對象的長度,即傳入參數的個數
callee: 引用當前正在執行的函數
可以通過數組下標 arguments[i] 來訪問數組中的每個元素
用法:
1)利用 argument[i] 訪問函數參數
在 js 中,不需要明確指出參數名,就能訪問它們,即可以訪問隱藏的參數
function useArguments() {
var sum = 0;
for(var i = 0; i < arguments.length; i++){
sum += arguments[i];
}
return sum;
}
2)利用 arguments.length 返回參數的個數
arguments.length 代表着實參的個數。
3)利用 arguments.callee 可以使匿名函數調用自身
callee 屬性的初始值就是正被執行的 Function 對象,這允許匿名的遞歸函數。
在使用函數遞歸調用時推薦使用 arguments.callee 代替函數名本身,表示對函數對象本身的引用
var sum = function (n) {
if (1 == n) {
return 1;
} else {
return n + arguments.callee(n - 1);
}
}
alert(sum(6));
4)利用 arguments 對象對函數進行模擬重載
js 語法不支持重載。但可用 arguments對象模擬重載效果。
重載:是指函數的方法名相同,但參數不同。
例如:
function add(a,b){
alert(a+b);
}
add(1,2);
function add(c,d,e){
alert(c+d+e);
}
add(1,2,3);
輸出 NaN 9;因爲後面的函數把前一個同名函數覆蓋掉了。
模擬重載,計算圓形,長方形,三角形周長
function length () {
if(arguments.length == 1) {
alert(2*3.14 * arguments[0]);
} else if(arguments.length == 2) {
alert(2*(arguments[0] + arguments[1]));
} else if(arguments.length == 3) {
alert(arguments[0] + arguments[1] + arguments[2]);
} else {
return null;
}
}
length(1);//6.28
length(3,4);//14
length(3,4,5);//12
可以使用 Array.prototype.slice.call(arguments) 把arguments類數組轉化爲數組,就可以使用數組的方法了。
function useArguments() {
var arr = Array.prototype.slice.call(arguments);
var sum = 0;
arr.forEach(function(value){
sum += value;
});
return sum;
}