JavaScript中的arguments
原文: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!

November 19th, 2008 on 7:58
忘了说了,这里有明城兄弟翻译的中文版: http://www.gracecode.com/Archive/Display/2551
November 19th, 2008 on 8:45
怎么不全文输出了?
November 19th, 2008 on 9:26
奇异的 arguments(翻译)…
原标题:arguments: A JavaScript Oddity
原作者:Andrew Tetlaw
原连接:http://www.sitepoint.com/blogs/2008/11/11/arguments-a-javascript-oddity/
在 Javascript 的函数中有个名为 arguments 的类数组对象。它看起来…
November 19th, 2008 on 10:24
RSS阅读器里,无法保证我原来的排版样式,从阅读和参与评论的角度上讲,我推荐链接到原文中查看。
November 19th, 2008 on 11:23
..我也说怎么没有全文输出了额- -!
至少还是给用户一个选择吧
November 19th, 2008 on 22:33
你博客的rss现在加了twitter的内容!有没有twitter的rss让我订阅吗?谢谢
November 20th, 2008 on 8:57
就我个人来说, http://www.awflasher.com/blog 这个博客的输出就做的不错,希望博主借鉴一下.嘿嘿.
让我有欲望去阅读原文和参与评论.而不是强迫.
你的原创内容非常棒,如果不全文输出我还是会来看的,只不过有点麻烦.
November 20th, 2008 on 10:14
repeat是一个创建函数的函数.
学习了!
November 25th, 2008 on 10:41
还是得先明白 call 和 apply方法啊
November 29th, 2008 on 20:24
借一步说话:射雕兄老早的程序:TREEpro怎么麽有后续版本了,实话,你的这个程序对我来说非常实用,希望继续,相当期待
April 3rd, 2009 on 9:55
请问怎么才算“类数组对象“
getElementsByTagName的到的对象用slice能在ff中转但不能在ie中转
April 7th, 2009 on 13:25
本文所提到的函数,正则表达式有些问题,按这种写法,只能对应1到9的参数。
原文下面的评论也有人提出了这个问题。
April 7th, 2009 on 13:31
原文下面的评论还给出了超出1-9范围的函数:
function format(string) {
var args = arguments;
var pattern = new RegExp(“%([0-9]+)”, “g”);
return String(string).replace(pattern, function(match, index) {
if (index == 0 || index >= args.length)
throw “Invalid index in format string”;
return args[index];
});
}
August 20th, 2009 on 19:18
repeat函数的时间戳没有clear,会带来性能的影响
March 17th, 2010 on 17:14
学习了这个函数的调用,很好。
March 17th, 2010 on 17:15
看明白了 这个事头部函数吗
April 13th, 2010 on 14:57
function comms { alert(‘s’); }
var somethingWrong = repeat(comms, 3, 2000);
somethingWrong(“Can you hear me, major tom?”); //?? 传这个参数干嘛
觉得很奇怪,这个示例有什么意义,呵呵
跑到明城那边一看,发现原文是:
function comms(s) { alert(s); }
leave a reply