在javascript函數體內,標識符arguments具備特殊含義。它是調用對象的一個特殊屬性,用來引用Arguments對象。 Arugments對象就像數組,注意這裏只是像並非哈。 javascript
javascript函數體內,arguments像數組(並非真的數組,是一個Arguments對象, 再次強調)同樣,有length屬性,能夠表明傳給函數的參數的個數。 java
引用一個形式參數能夠用參數名,也能夠用arguments[]數組形式,其中arguments[0]表示第一個參數。 web
arguments.length屬性: 數組
js不會主動爲你判斷你到底給函數傳了多少個參數,若是你多傳了,多餘的部分就沒有被使用,若是你少傳了,那麼沒傳的參數值就是undefined 函數
因此咱們能夠藉助arguments的length屬性來檢測調用函數時是否使用了正確數目的實際參數,由於javascript是不會爲你作這些 事的 spa
function f(x,y,z) 日誌
{ 對象
//首先檢查傳遞的參數數量是否正確 遞歸
if(arguments.length!=3) ip
{
thrownew Error("function f called with "+ arguments.length+"arguments ,but it not 3 arguments.");
}
//下面運行真正的函數
}
arguments還爲咱們提供了這樣一種可能,就是爲一個函數傳任意數目的實際參數:
好比說,我想判斷你傳給個人一些數字的大小,取出最大的那個,對,沒錯,你傳多少參數都行,可是前提是你要傳數字,由於我在函數內部懶得判斷了。 呵。
function max()
{
//根據我上一篇日誌,這已是JavaScript內最小的數字了
var m = Number.NEGATIVE_INFINITY;
for(var i =0; i < arguments.length; i++)
{
//只要有任何一個參數比m大,那麼m就變成了這個參數的值
if(arguments[i]> m)
m = arguments[i];
}
return m;
}
怎麼樣?這個方法很巧妙吧?呵呵。
說明一下arguments與真正傳的形式參數是一致的:
好比,你給函數傳了一個叫param的參數,而且只有這一個參數,那麼param與arguments[0]都是對這個參數值的引用,
改變其中一個值,即改變了兩者全部的值
function change(param)
{
//好比我傳的param爲simaopig,那麼alert就是simaopig,
//若是啥也沒傳就會alert undefined
alert(param);
//用arguments[0]改變了這個參數的值
arguments[0]='xiaoxiaozi';
//沒錯,這個值變成了xiaoxiaozi
alert(param);
}
arguments的callee屬性:
arguments的callee屬性是用來引用當前正在執行的函數,這對未命名的函數調用自身很是有好處。
如今用arguments的這個callee一樣能夠簡單的實現
//用函數直接量,採用arguments.callee屬性實現遞歸函數
var result =function(x){
if(x<=1)return1;
return x*arguments.callee(x-1);
};
在最後提醒你們一點,既然這個arguments這麼厲害,那麼咱們就不要爲變量命名爲arguments 了,事實上arguments是javascript的保留字之一.