关于JS函数参数,可谓是非常灵活,实参的传递可以不用跟形参的定义个数保持一致。
例如:function demo(x,y,z,){
return x+y;
}
demo(1,2);
demo(1,2,3,4)
这样去调用函数都可以正常执行。这是因为实参的传递都不是简单的一一对应的赋值给形参x,y。而是被赋值给了arguments这个对象。
虽然是对象,但是拥有length这个属性,可以判定实际传递实参的个数,并且通过下标可以访问到对应的属性。如arguments[arguments.length-1]则可以访问到函数最后一个实参的值,如果定义好的形参传递了实参,该形参则跟arguments对象的属性可共享同一个值,否则不共享。例如:
(function demo2 (x,y){
x = 2;
y = 10;
console.log(x)//输出为2
console.log(arguments[0])//输出为2
console.log(y) //输出为10
console.log(arguments[1])//undefinded
arguments[1] = 20;
console.log(y) //输出为10
console.log(arguments[1])//输出为20
})(1)
利用这个条语句,var args = Array.prototype.slice.call(arguments) 可转化为数组。arguments对象还有一个属性 callee,可以获取当前函数。
(function demo3 (){
console.log(arguments.callee) //输出demo3
})();