call和apply可以间接的调用函数。
1、允许显示的调用this。
2、任何函数都可以作为任何对象的方法调用,哪怕这个函数不是这个对象的方法。
3、参数问题,可以指定调用函数的实参,call使用调用函数的参数列表,而apply要求以数组形式传入。
可选形参
1、传入的实参少,那剩下的形参将是undefined;
2、要给多余的形参,若是不存在实参,附一个初始值。
3、可选的形参写在最后。
4、可选的形参前面加上注释/**optional/。
实参多
1、arguments是实参的列表。
2、实参数量大于形参时,多余的实参可以用arguments【2】,arguments【3】。。。获取。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> </body> </html> <script> function test(){ console.log(arguments.length); console.log(arguments[2]); console.log(arguments[8]); } test(1,2,3,4,5,6,7); </script>
不定实参函数:值不行、个数不到、顺序不定。
实参的集合arguments还有一个属性特别有用:arguments.callee;返回正在执行的函数;
<script> function test(n){ n+=1; console.log(arguments.callee); } test(1); </script>
也可用于递归运算:
<script> var sum=0; function test(n){ if(n>10) return sum; return sum=n+arguments.callee(n+1); } console.log(test(1)); </script>
形参多,记不住顺序。可以用一个将参数封在一个对象中,实参从对象中获取,对象的属性 键:值的形式,可以打乱顺序。
例子:
//定义目标数组和原数组、实参集合。 var a=[1,2,3,4]; var b=[]; var ar={ from:a, length:4, to:b, }; //多个实参的对象 function arrayCopy(argus){ //功能模块 都用统一的argus提供的接口获取参数 for(var i=0;i<argus.length;i++){ argus.to[i]=argus.from[i]; console.log(a[i]); console.log(b); }; }; arrayCopy(ar); //运行函数