间接调用

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); //运行函数

 当函数作为对象的属性调用时,函数就称为方法。

原文地址:https://www.cnblogs.com/gaidalou/p/5960478.html