arguments浅析
2009-12-20 20:52 BlueDream 阅读(398) 评论(0) 编辑 收藏 举报在javascript中有个arguments这个奇异的类数组对象.它的作用就是保存当前函数调用的参数.
之所以说它是类数组.是因为它保存参数的形式类似数组.但实际上并不是一个数组
使用typeof arguments 返回的是"object". 它不能像Array一样使用push和pop等方法.
但却可以使用下标以及长度属性(length)获取它的值.
首先让我们认识一下arguments的产生
function getArgs(){ var args = arguments; for(var i = 0, len = args.length; i < len; i++){ document.write(arguments[i] + ' ,'); // 会依次打印出传入的参数 } } getArgs('1', '2', 'Tom', 'Jack'); // 当一个函数调用传入的参数 就会被存储到对应的arguments的类数组中
虽然这样看上去arguments貌似没什么用途.但如果加以利用.其实会有很好的效果. 比如Dean Edwards写的base2库中.有个format的模板函数
function format(string) { var args = arguments; var pattern = new RegExp('%([1-' + arguments.length + '])', 'g'); return String(string).replace(pattern, function(match, index) { return args[index]; }); } document.write(format('Today is %1, Tomorrow is %2, The day after tomorrow is %3!', 'Sunday', 'Monday', 'Tuesday'));
结果为:
Today is Sunday, Tomorrow is Monday, The day after tomorrow is Tuesday!
预设模板函数的应用.为了便捷的重复利用函数
function makeFun(){ 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 makeFormat = makeFun(format, 'Today is %1, Tomorrow is %2, The day after tomorrow is %3!'); document.write(makeFormat('Sunday', 'Monday', 'Tuesday')); document.write(makeFormat('星期日', '星期一', '星期二'));
这样每次重复利用函数都不需要重新构造.
arguments不单单这些功能.还有很多方面的应用.比如自引用的arguments.callee-->可以用来调用自身的函数.
比如我们有个对话框弹出函数
function dialog(str) { alert(str); }
如果我们想让上面对话框 重复弹出3次. 每次相隔两秒钟,那么函数就可以这么写
function repeat(fun, times, delay) { return function(){ if(times-- > 0) { fun.apply(null, arguments); var args = Array.prototype.slice.call(arguments); var self = arguments.callee; setTimeout(function(){ self.apply(null, args)}, delay); } } } var RepeatDialog = repeat(dialog, 3, 2000); RepeatDialog('open Dialog');
当然arguments的用途远远不止这些.需要大家进一步的挖掘