• 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。

  • 相关阅读:
    nginx 添加response响应头
    2018年 js 简易控制滚动条滚动的简单方法
    handsontable 常用 配置项 笔记
    使用react-handsontable
    node 常用模块及方法fs,url,http,path
    POST application/json 适用于传递多层的json
    react 子元素修改父元素值的一个偏方,虽然简单,但是不建议用,
    mysql 连接出错 'mysqladmin flush-hosts'
    solr7.3.1定时增量索引
    mysql8修改密码加密方式
  • 原文地址:https://www.cnblogs.com/liuyongjia/p/7696101.html
Copyright © 2020-2023  润新知