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
我们提供一个模板字符串,可以使用%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?”);