• call()和apply()的区别


    call和apply的相同点是:1、都可以调用函数;2、都可以改变this的指向

    function add(c, d) {
        return this.a + this.b + c + d;
    }
    var strObj = { a: 1, b: 2};
    console.log(add.apply(strObj,[3,3])); 
    console.log(add.call(strObj,3,3)); 
    //以上两个打印结果都是 9

    不同点:

    1、call的多个参数, 第一个参数是this指向的对象,后面的参数均是传入Function的参数,有两个就是传给Function两个参数,有三个就是传了三个,有几个传几个;

    2、apply的只有两个参数,第一个参数是this指向的对象,第二个参数是传入Funtion的参数组成的数组。

    apply实现取出数组中的最值:

    //数组中的最大值:
    var arr=[2,4,8,5,67,89,64,32,697]
    Math.max.apply(Math,arr) //打印结果是 697
    
    
    //数组中的最小值:
    var arr=[2,4,8,5,67,89,64,32,697]
    Math.min.apply(Math,arr) //打印结果是 2
    
    
    //注意:因为apply第一个值是可以改变this的指向,这个案例不需要改变this指向,那么我们就指向调用者,所以第一个参数就传值Math

    apply可以通过Array.prototype.push实现两个数组的合并:

    push方法没有提供push一个数组,但是它提供了push(param1,param2...paramN),所以也可以用apply来转换一下这个数组

    var arr1=[2,8,5,54,82,55];
    var arr2=[6,4,35,34,21,93,432,23]
    Array.prototype.push.apply(arr1,arr2);   //打印结果是5
     //得到合并后数组的长度,因为push就是返回一个数组的长度

    也可以这样理解,arr1调用了push方法,参数是通过apply将数组转换为参数列表的集合。

    当然,也有人可能会说数组合并也可以用数组的concat方法,可以是可以,但是要清除其区别是concat使用之后返回的是一个数组(当然也可以获取其长度),而通过apply将数组转化的结果是一个集合的长度。不同场景可以区别使用。

  • 相关阅读:
    5.2 spring5源码--spring AOP源码分析三---切面源码分析
    5.2 spring5源码--spring AOP源码分析二--切面的配置方式
    在Dubbo中使用Zookeeper入门案例
    Dubbo直连方式改造
    Dubbo直连方式
    16.3.3 对矢量可执行的其它操作
    16.3.2 可对矢量(vector)执行的操作
    16.3 标准模板库
    16.2.2 有关智能指针的注意事项
    16.2.1 使用智能指针
  • 原文地址:https://www.cnblogs.com/web001/p/14807633.html
Copyright © 2020-2023  润新知