原文:arguments: A JavaScript Oddity. 很不錯的文章,推薦一讀。我的一點讀後感:
arguments是JavaScript裡的一個內置對象,和NodeList類似,擁有length屬性,但沒有push和pop等數組方法。
Dean Edwards的format函數很觸發靈感:
function format(string) { var args = arguments; var pattern = new RegExp('%([1-' + args.length + '])', 'g'); return String(string).replace(pattern, function(match, index) { return args[index]; }); } alert(format('%1 want to know whose %2 you %3', 'I', 'shirt', 'wear'));
注意三點:1. String(string)的用法,保證了string為任何值(比如null, false, 123等)時都不會出錯。2. 溫習下replace方法,第二個參數可以是函數,非常靈活。3. arguments和正則的巧妙配合,實現了format功能。
將arguments轉換為真實數組的辦法:
var args = Array.prototype.slice.call(arguments);
這個沒什麼好說的,類數組對象轉換為數組都可以采用slice方法。
創建帶預置參數的函數:
function makeFunc() { var args = Array.prototype.slice.call(arguments); var func = args.shift(); return function() { return func.apply(null, args.concat(Array.prototype.slice.call(arguments))); }; } var majorTom = makeFunc(format, "This is Major Tom to ground control. I'm %1."); majorTom("stepping through the door"); majorTom("floating in a most peculiar way");
這個挺有意思的。makeFunc是一個可以創建函數的函數,所創建的函數都帶有相同的的預置參數。這能避免代碼重復,提高復用性。
創建自引用的函數:
function repeat(fn, times, delay) { return function() { if(times-- > 0) { fn.apply(null, arguments); var args = Array.prototype.slice.call(arguments); var self = arguments.callee; setTimeout(function(){self.apply(null,args)}, delay); } }; } function comms { alert('s'); } var somethingWrong = repeat(comms, 3, 2000); somethingWrong("Can you hear me, major tom?");
其實就是arguments.callee的用法,經常在匿名函數中用來引用自身,這裡用來實現repeat函數。注意repeat是一個創建函數的函數,因此有了somethingWrong. 思路有點繞,但想想明白後,很不錯。
用原文中的最後一句話來結尾:
arguments is not often used, a little quirky, but full of surprises and well worth getting to know!