zoukankan      html  css  js  c++  java
  • this和bind、call、apply的关系

    最新的更新:重新理解它们之间的关系链接 

    函数调用的关系:

    const test = {
      val : 10,
      ret: function() {
        return this.val
      }
    }
    console.log(test.ret()) //  10

    上面的代码是一个对象test,里面有属性val,方法ret,调用ret就是test.ret,其中test就充当调用者的身份,而函数中的this就是指代调用者,通常情况下,this都是指代调用者,那如果我们想将test的方法ret共给其他对象使用的时候,我们该怎么改变调用者呢?这就应用到了bind函数,它可以改变方法的调用者,如下的代码(红色是增加的代码):

    const test = {
      val : 10,
      ret: function() {
        return this.val
      }
    }
    const test2 = {
      val: 20
    }
    console.log(test.ret.bind(test2)) //  ƒ () {return this.val;}

    此处返回的是一个函数,我们可以直接调用它,最后可以得到的值是20, 由此我们可以总结:bind函数将调用者从test改为test2,所以返回的是20而不是10,但是并没有执行这个函数。那如果在改变调用者的同时也执行此函数呢?这里就应用了call或者apply函数,代码如下(红色是修改的代码):

    const test = {
      val : 10,
      ret: function() {
        return this.val
      }
    }
    const test2 = {
      val: 20
    }
    console.log(test.ret.call(test2))  // 20
    console.log(test.ret.apply(test2))   // 20

    那call和apply又有什么区别呢?引用MDN的定义:the fundamental difference is that call() accepts an argument list, while apply() accepts a single array of arguments.

    代码演示(红色是增加的代码):

    const test = {
      val : 10,
      ret: function(num1,num2) {
        return this.val + num1 + num2
      }
    }
    const test2 = {
      val: 20
    }
    const arr = [1,2]
    console.log(test.ret.call(test2, 1, 2))  // 23
    console.log(test.ret.apply(test2, arr))  // 23
  • 相关阅读:
    【机器学习笔记】EM算法及其应用
    【机器学习笔记】循环神经网络RNN
    【caffe范例详解】
    Caffe on Windows (Visual Studio 2015+CUDA8.0+cuDNNv5)
    【Keras案例学习】 CNN做手写字符分类(mnist_cnn )
    Celery分布式文件队列
    通过nginx+lua或openresty实现web站点的waf功能
    使用docker hub获取kubernetes各个组件的镜像
    使用Ansible快速构建kubernetes1.10.4HA高可用集群
    创建私服maven服务
  • 原文地址:https://www.cnblogs.com/re-doc/p/14068171.html
Copyright © 2011-2022 走看看