首先要说一下arguments:
ECMAScript中不介意传递进来的是什么参数,有多少个,更不在乎是什么数据类型的。为什么用这样那?原因就是ECMAScript的内部是用一个数组来表示的,函数体内可以通过一个叫arguments的对象来访问这个参数数组。Arguments是一个与数组类似的东西,在javascript中arguments是一个特殊的对象,不需要明确的指出参数的名字就可以访问;
Arguments对象还可以用来检测参数的个数,即:arguments.length。通过这个length属性你就能知道有多少个参数传递给了函数。
function a(){
console.log(arguments.length);
}
a("可了不得","可了不得");
a();
a("可了不得","可了不得","可了不得");
所以说结果是:2,0,3;
注意是输出每次调用函数的的参数个数:
function a(para1,para2){
console.log(arguments.length);
}
a("可了不得","可了不得");
a();
a("可了不得","可了不得","可了不得");
所以即使是原来的函数是有参数的那么也是2,0,3;
ECMAScript是不会去验证传递给函数的参数的个数是不是等于函数定义的参数个数,你可以传递任意个数的参数(网警之前文档里好像规定最多接受255个)任何遗漏的参数都会以undefined的形式表现出来的。
除了length,他还可以用方括号语法,就是arguments[i]的形式访问参数。
function a(para1,para2){ console.log(arguments.length); console.log((arguments[0])) console.log((arguments[1])) console.log((arguments[2])) } a();
结果是:
0,undefined,undefined,undefined
function a(para1,para2){ console.log(arguments.length); console.log((arguments[0])) console.log((arguments[1])) console.log((arguments[2])) } a("可了不得","可了不得"); a();
有的人还会这样想,就是前面调用函数的时候赋值了,那么后面的是不是也影响了(没有这种想法请跳过),这个想法是错误的,两次调用毫无关系,这样想,你定义了一个函数就能用一次,一次性的,那这是啥代码啊。
2,可了不得,可了不得,undefined
0,undefined,undefined,undefined
这下懂了吧,什么是调用的这个函数。
不管如此,我们还可以用他来模拟函数的重载:
function add(){ if(arguments.length==1){ return arguments[0] }else if(arguments.length==2){ return arguments[0]+arguments[1]; }else{ return '可了不得' } } console.log(add(1)); console.log(add(2,3)); console.log(add(3,4,5));
这个还是挺重要的,要知道ECMAScript不能像传统那样实现重载,在其中根本就没有函数签名,所以说真正的重载是不可能做到的,如果说像java那样定义两个名字相同的函数,因为我们参数没有类型,所以说就相当于被定义了两次,最后后面的会覆盖前面的。用arguments就可以模仿重载啦。
参数还可以和命名参数一起用,比如说你定义了一个函数 function add(num1,num2){};那么函数里面的arguments[0]和num1是一样一样的。他们的值是同步的,但是注意他们的内存空间是独立的,如果说我们又取了一个arguments[2],就是第三个参数,那么第三个参数的值是不会反映到命名参数中去的。(长度实时决定,不是命名参数所能左右的,并且严格模式下,arguments的值是不会反应到命名参数中去的);
。。。本来是要说callee,caller的,但是我觉得arguments是个基础,要说说。
说好了不写那么长的又墨迹了1000字,这可是比我写思想汇报痛快多了。每天一个知识点,走起!