代码改变世界

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的用途远远不止这些.需要大家进一步的挖掘