arguments,callee解读

arguments 是JS里面一个内置对象,是一个很有意思的对象


任何一个function 都存在有arguments,他是一个Object对象,有length,index方法,但没有数组的push,pop之类的方法。


一些常用的场景:

判断,参数数目是否正确:

    function f (x,y,z){
        if(arguments.length != 3){
            throw new Error("参数数目不对");
        }
    }

对任意个参数都支持的函数方法:

取多个数字中最大的值

    function max() {
        var m = Number.NEGATIVE_INFINITY; //这个是js中最小的数字了
        for (var i = 0; i < arguments.length; i++) {
            if (arguments[i] > m) m = arguments[i];
        }
        return m;
    }


//arguments.callee 是获取当前调用函数的本体

//arguments.callee 



我们提供一个模板字符串,可以使用%1到%9给返回值添加一个占位符,然后提供给九个其他参数插入

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];

    });

};

// format(“And the %1 want to know whose %2 you %3″, ”papers”, ”shirt”, ”wear”);


arguments对象并不是一个真正的数组,他的type of 返回的是一个Object的对象,我们可以将它转化为标准的数组:

var args = Array.prototype.slice.call(arguments); 



//

    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];

        });

    };

    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.");

args.shift(),将format函数从数组中移出并返回.arguments剩下的函数则作为format的参数

这样在每次使用的时候,就不需要调用format了

这可以看成是一个模板功能.


majorTom(“stepping through the door”);   

“This is Major Tom to ground control. I’m stepping through the door.”   



arguments.callee的惊喜用法:

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(s) {   

  alert(s);   

}  
var somethingWrong = repeat(comms, 3, 2000);   

somethingWrong(“Can you hear me, major tom?”); 

















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值