JavaScript arguments 对象
功能:存放实参的参数列表
test1(1,2);//[1,2]
test1(1,2,3,4,5);//[1, 2, 3, 4, 5]
function test1(){
console.log(arguments);
}
argutments在普通模式里,可以在函数内部修改函数的值,但是不建议那么做;这点在严格模式下也有限制
- 在严格模式,函数内部不能修改argument的值,即使修改了,操作也是无效的;
- 其次重写arguments值会导致语法错误,代码不执行;
特性:
- 仅能在函数体内使用
test1(1,2);//[1,2]
function test1(){
console.log(arguments);
}
console.log(arguments);//Uncaught ReferenceError: arguments is not defined
- 带有下标属性,但是并非数组
test1(1,2);//1 2 undefined
function test1(){
console.log(arguments[0],arguments[1],arguments[2]);
}
-
函数声明时自动初始化
-
属性
- 1.length 获取函数实参的长度
test1(1,2,3,4,5);// 输出5 function test1(){ console.log(arguments.length); }
- 2.callee 返回当前正在指向的函数
test1(1,2,3,4,5);// 输出函数本身 function test1(){ console.log(arguments.callee); }
-
3.caller 返回调用当前正在执行函数的函数名;在chrome里是没有的;尽量不要用arguments的这个属性;
- 在chrome里的callee是arguments.callee.caller
- 对于函数来说,caller 属性只有在函数执行时才有定义。 如果函数是由 Javascript 程序的顶层调用的,那么 caller 包含的就是 null 。
function callerDemo() { if (arguments.callee.caller) { var a = callerDemo.caller.toString(); console.log(a); } else { console.log("this is a top function"); } } function handleCaller() { callerDemo(); } handleCaller(); function calleeDemo() { console.log(arguments.callee); } calleeDemo();
函数的参数是函数的灵魂
ECMA中的函数不在乎传来多少个参数,也不在乎你传进来的是什么类型的,即使你定义的函数值接受两个参数,在调用的时候未必严格的传进两个实参,你传一个,三个,不传都是没有问题的、这就是函数的多态
;
原理是因为ECMA是把函数用在内部用一个”数组”来表示的,函数接受到的始终都是这个数组,并不关心这个”数组”是否包含参数,已经包含的都是什么参数,可以通过arguments[index]
这种的方式来访问,也可以通过arguments.length
的值来确定传进来了多个参数;
function testArgument(){
console.log("hello argument[0]:"+arguments[0]+" and argument[1]:"+arguments[1]);
}
testArgument("1","2");//hello argument[0]:1 and argument[1]:2
testArgument("1");//hello argument[0]:1 and argument[1]:undefined
testArgument();//hello argument[0]:undefined and argument[1]:undefined
函数的一个特点,形参只是提供了操作的便利,但并不是必须的;函数的定义和调用与参数是没有关系的,只有在函数内部引用了形参才与实参个数和值有关系;
如果函数只是定义了,但是没有执行,那就是脱裤子放屁了;因为对程序不会有任何意义;
function sum(a,b){
if(arguments.length===2){
console.log("第1个参数和第二个参数的和是:"+a+b);
}else if(arguments.length===1){
console.log("block,只传了一个参数 "+a+",让我如何相加")
}else{
console.log("我拒绝运算!")
}
}
sum(10,8);//第1个参数和第二个参数的和是:108
sum(10);//block,只传了一个参数 10,让我如何相加
sum();//我拒绝运算!
上面就牵扯到了函数的多态,根据不同的参数来做不同的事情;