什么是argument?
总的来说 argument 是所在函数的一个内置类数组对象,类数组对象和数组相似,但是他不是数组,没有数组那样多的方法。
那么argument 里有什么呢?
function showargs() {
console.log( arguments );
}
showargs(1,2,3,4,5);
这里我们可以看到arguments对象将我传入的五个参数以数组的形式保存在里面,还有保存了我传入函数的实参的个数(length)。而且我们可以看到arguments对象的 __ proto __ 是指向object的,这也说明了他是个类数组对象,而不是一个数组。
我在学js的时候函数调用时实参要和形参一一对应,但是现在我们可以在函数内部用argument 调出实参,于是有了下面的写法:
function add() {
if( arguments.length == 2 ){
return arguments[0] + arguments[1];
}else{
return '传入参数不合法';
}
}
console.log( add(2,3) );
console.log( add(1,2,3) );
arguments还有一个叫做callee的属性,这个属性是表示的是当前函数的一个引用,简单点说,这个属性里面存储的我们调用的这个函数的代码。
function showcallee() {
var a = '这里是代码';
var b = '这是另一段代码';
var c = a + b;
console.log(arguments.callee);
return c;
}
showcallee();
虽然我并不明白这个功能有啥用,但是还是了解了解吧,万一用上了呢。那argument 就只有这个作用吗,当然不是,argument很重要的一点是可以重载,重载的定义是指函数的方法名相同,但参数不同(重载可以减少代码的重复书写)。比如我写两个关于js的同名函数:
function add(a,b){
var sum =a+b;
console.log(sum);
}
add(2,3)
function add(c,d,e){
var sum =c+d+e;
console.log(sum);
}
add(2,3,4)
输出结果为NaN 9,这就说明后面的函数把前一个同名函数覆盖掉了,从而可以得出js函数不存在重载,永远调用最后一个方法。于是这就要用到argument了。
function calc(){
//如果用户传入一个参数,求平方
if(arguments.length==1){
console.log(arguments[0]*arguments[0]);
}else if(arguments.length==2){
//如果用户传入两个参数,就求和
console.log(arguments[0]+arguments[1]);
}
}
calc(4); //16
calc(5); //25
calc(4,5); //9
还要强调一点:arguments这个对象不能显式创建,arguments对象只有函数执行时才会被创建,这就又牵涉到JavaScript的执行过程了,可以自行了解预编译期(预解析期)和执行期。