• 浅析call和apply


    概述:

    今天我们讲一个在咱们工作中不经常用,但是却在面试中经常被问到的方法:call方法和apply方法。

    call方法:

    call方法:调用一个对象的一个方法,以另一个对象替换当前对象。
    调用方法:call([thisObj,obj1,obj2....])
    看下面的例子:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function add(a,b)
    {
        alert(a+b);
    }
    function sub(a,b)
    {
        alert(a-b);
    }
     
    add.call(sub,3,1);//4
    结果是“4”,call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 说的在直白点,上面例子中,把add放到了sub中执行,所以a+b = 4。 如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

    apply方法:

    apply方法的意思和call差不多,唯一的区别就是传递的参数是个数组。
    调用方法:call([thisObj,[argArray]])
    看下面的例子:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function test1(name,age)
        {
            this.name=name;
            this.age=age;
        }
    /*定义一个学生类*/
    function test2(name,age,grade)
        {
            test1.apply(this,arguments);
            this.grade=grade;
        }
    //创建一个学生类
    var test3=new test2("uw3c",24,"一年级");
    //测试
    alert("name:"+test3.name+" "+"age:"+test3.age+" "+"grade:"+test3.grade);
    大家肯定会惊奇的发现,
    this:在创建对象在这个时候代表的是student
    arguments:是一个数组,也就是["uw3c","24",”一年级”];
    也就是通俗一点讲就是:用test3去执行test1这个类里面的内容,在test1这个类里面存在this.name等之类的语句,这样就将属性创建到了test3对象里面
     

    什么时候用call方法、apply方法:

    在给对象参数的情况下,如果参数的形式是数组的时候,比如apply示例里面传递了参数arguments, 这个参数是数组类型,并且在调用test1的时候参数的列表是对应一致的(也就是test1和test2的参数列表前两位是一致的) 就可以采用 apply , 如果我的test1的参数列表是这样的(age,name),而test2的参数列表是(name,age,grade),这样就可以用call来实现了,也就是直接指定参数列表对应值的位置。
  • 相关阅读:
    【洛谷P6835】线形生物
    【洛谷P2679】子串
    【洛谷P5072】盼君勿忘
    【洛谷P3312】数表
    【洛谷P1447】能量采集
    【洛谷P2257】YY的GCD
    【洛谷P4318】完全平方数
    【AT2300】Snuke Line
    window.showModalDialog
    js typeof
  • 原文地址:https://www.cnblogs.com/Logo-TPM/p/6188958.html
Copyright © 2020-2023  润新知