zoukankan      html  css  js  c++  java
  • bind、apply与call

    bind、apply与call

    先说观点:不论是bind、apply还是call,最大的好处就是代码复用。

    bind

    在开发中,我们只有复用代码时,才会出现this指向需要改动的情况。
    纵观bind的常用方法,不论是偏函数还是快捷调用等等,即使是setTimeout,也都是希望能把别的地方的方法拿过来用,才会出现this指向不对的情况。
    一言以蔽之:因为是面向对象,才会出现绑定this的需要。
    这话并不是空穴来风,面向对象的好处就在于抽象程度高,封装好的一个类,可以在不改变源码的情况下,经过一些操作,拿来即用。这是一个无比方便的地方,相信改过别人代码的同学对此深有体会。
    面向对象经过高度的抽象,使得代码复用更加方便,也导致了更多的模块管理相关的问题,这又是一个大课题,就不细讲了。
    不论是出于性能还是开发成本的考虑,我们在开发中,经常要用其他对象上的方法。举个例子,把类数组对象转为数组对象:

    var transfer =  Function.prototype.apply.bind(Array.prototype.slice);
    transfer(obj);
    

    bind的其他用法可以参考MDN,我在这里不多写了。

    call与apply

    call和apply大同小异,唯一不同在于传参,call接受变长参数,apply接受数组或者类数组对象。
    具体使用方法,参考MDN,callapply
    同样的,call和apply也是因为想要复用代码,出现了this指向不对的情况,怎么办,给它传this吧,传哪指哪。
    举个例子:

    var say = {
      name: 'Mike',
      hi: function () {
          console.log('hi ' + this.name)
      }
    };
    function sayHi(name){
      this.name = name;
      
    }
    say.hi.call(new sayHi('Bob'));
    

    bind与call和apply的区别

    bind和call的区别就在于,bind会返回一个新的函数,call和apply都是直接调用原函数,并不会返回一个新函数。

    在需要新函数的地方用bind,只是想做一锤子买卖,就用call和apply。
    在不清楚多少参数的地方,建议new一个数组,push参数进去,或者大部分情况下,可以传arguments对象,就用apply,否则,就用call。

  • 相关阅读:
    大数据技术栈,主要有哪些
    微服务海量日志监控平台
    Elastic APM安装
    Elasticsearch SSL认证/证书制作
    Elastic APM 上报数据分析与应用
    elasticsearch7.X x-pack破解
    Netty源码学习系列之5-NioEventLoop的run方法
    Netty源码学习系列之4-ServerBootstrap的bind方法
    Netty源码学习系列之3-ServerBootstrap的初始化
    Netty源码学习系列之2-NioEventLoopGroup的初始化
  • 原文地址:https://www.cnblogs.com/liuyongjia/p/7696101.html
Copyright © 2011-2022 走看看