一、什麼是arguments
arguments 是是JavaScript裡的一個內建對象,它很古怪,也常被人所忽視,但實際上是很重要的。所有主要的js函數庫都利用了arguments物件。所以agruments物件對於javascript程式設計師來說是必需熟悉的。
所有的函數都有屬於自己的一個arguments對象,它包含了函所要呼叫的參數。他不是一個數組,如果用typeof arguments,回傳的是'object'。雖然我們可以用呼叫資料的方法來呼叫arguments。例如length,還有index方法。但數 組的push和pop物件是不適用的。
二、建立一個靈活的函數
看起來貌似argument物件使用起來十分有限,但是實際上它是一個非常有用的物件。你可以透過使用argument物件讓函數能夠呼叫數量不定 的參數。在Dean Edwards的base2函式庫裡有個格式化的函數,展現了這個彈性。
function format(string) { var. 🎜> var pattern = new RegExp(“%([1-" arguments.length "])”, ”g”);
return String(string).
return args[index];
});
};
我們提供了一個模板字串,你可以用”%1”到“%9”為返回值添加一個佔位符。然後提供給九個其他參數插入。
複製程式碼 程式碼如下:format(“And the %1 want to know whose %2 you % 3″, ”papers”, ”shirt”, ”wear”);
上面的程式碼會回傳:And the papers want to know whose shirt you wear" .
有件事情我們需要注意下,在定義函數的時候,我們只規定了一個參數,string。 arguments物件轉換成一個真正的陣列
雖然arguments物件不是一個真正的javascript數組,但是我們還是可以輕易的把它轉換成標準的數據,然後進行數組操作。 🎜>
複製程式碼
程式碼如下:
代碼如下:
function makeFunc() {
var args = Array.prototype. 🎜> var func = args.shift();
return function() {
return func.apply(null, args.concat(Array.prototype.slice); ;
複製代碼
代碼如下:
var majorTom = makeFunc(format, ”This . I'm %1.”);
你可以像這樣呼叫majorTom函數:
majorToming through the door”);
majorTom(“floating in a most peculiar way”);
每次你呼叫majorTom,它會同時呼叫format函數和第一個argument,已經寫好的模板。那麼將回傳
「This is Major Tom to ground control. I'm stepping through the door.”
「This is Major Tom to ground control. I'm floating in a most peculiar way.」
五、創建引用自身的函數
你可能覺得這樣很酷,不過,arguments還有更多的驚喜。他還有其他有用的功能:callee方法 。 Arguments.callee包含了一個函數的參考去建立一個argument物件。那麼該如何使用呢?
Arguments.callee方法能讓一個匿名函數很方便的指向本身。
Repeat是一個承載了一個函數參考和兩個數字的函數。第一個數字是函數呼叫幾次,第二個數字是每個呼叫的間隔時間,單位是毫秒。
function repeat(fn, times, delay) { . () {
if(times– > 0) {
fn.apply(null, arguments); all var self = arguments .callee;
setTimeout(function(){self.apply(null,args)}, delay);
}
}
};
Repeat函數使用了arguments.callee方法從變數self去取得一個引用,指向執行原始指令的函數。這樣,匿名函數就可以再次呼叫本身。
我有一段超級簡介的函數,承載了一個字串和執行alert方法。
複製程式碼
alert(s);
}
然而,我想創建一個特殊的版本,透過這個版本我可以重複這個動作三次,每次間隔2秒鐘。那麼,我們可以
複製程式碼
程式碼如下:var somethingWrong = repeat(comms, 3, 20var somethingWrong = repeat(comms, 3, 20
var somethingWrong = repeat(comms, 3, 20
var somethingWrong = repeat(comms, 3, 20
var somethingWrong = repeat(comms, 3, 20
var somethingWrong = repeat(comms, 3, 20
var somethingWrong = repeat(comms, 3, 20
var somethingWrong = repeat(comms, 3, 20000) ; somethingWrong(“Can you hear me, major tom?”); 呼叫了somethingWrong函數的結果就是複這個動作三次,每次alert間隔2秒鐘。 Arguments雖然不是經常用到,有點古怪,但是,它充滿了驚喜,非常值得我們去了解 。