• apply和call的用法


    【原创】apply和call的用法

    查了大量的资料, 经过N次测试, 总结如下(希望给像我一样的菜鸟有帮助)

    apply:
       方法名A.apply(对象名B, [执行A需要的参数,用数组表示]);
    call:
       方法名A.call(对象名B, [执行A需要的参数,用逗号分隔]);

      apply和call功能是: 执行某一个对象的方法A, 但在执行的时候临时把它内部的this指向一个别的对象B, 后面是执行A要用到的参数.
      apply和call作用一样, 区别只不过是参数一个要用数组表示, 一个要用逗号分隔的方式表示. 看例子

    function obj1()
    {
        this.arg = 1;
        this.M = function (a, b){ return this.arg + a + b;}
    }
    function obj2()
    {
         this.arg = 2;
    }
    var k1 = new obj1();
    var k2 = new obj2();

    上面定义了两个对象它们都有arg这个属性, 一个为1, 一个2, 当我们执行
    k1.M(10, 20) 时, 得到31, 也就是说:

    k1.M(10, 20) == 31 //此时this为k1, arg为1, 这句好理解

    再看语句: k1.M.apply(k2, [10, 20])

    这句意思是说: 执行k1对象的M方法, 但在执行的时候把该方法内部出现的this指向k2, 同时把10, 20这2个参数传给M.

    由于k1.M在执行时,内部this指向了k2, 而k2的arg属性值为2, 因此
    this.arg + a + b = 2 + 10 + 20 = 32, 也就是说:

    k1.M.apply(k2, [10, 20]) == 32; //因为M内部this不再指向k1, 而指向k2

    要用call方法, 只需要把后面参数换成用逗号分隔的就行, 即:
    k1.M.call(k2, 10, 20)

    申明: 我也是菜鸟, 有错的地方请指出. 之所以写这个, 是因为看到好多教材上都说什么绑定绑定的, 完全看不懂.
  • 相关阅读:
    TCP的三次握手与四次挥手
    HashMap源代码分析(JDK1.8)
    HashMap实现原理分析(JDK1.8前)
    codebook法分割前景目标
    平均场景法分割前景目标
    边缘梯度方向直方图的构建
    学习opencv 第六章 习题十三
    《学习OpenCV》 第四章 习题六
    《学习Opencv》第五章 习题6
    Opencv实现的简易绘图工具
  • 原文地址:https://www.cnblogs.com/aaa6818162/p/1566474.html
Copyright © 2020-2023  润新知