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。

  • 相关阅读:
    win7网络共享原来如此简单,WiFi共享精灵开启半天都弱爆了!
    JQUERY UI Datepicker Demo
    Official online document, install svn server in centOS
    JAVE not work in linux
    AMR 转mp3 失败
    XD, XR, DR 股票
    Linux 下MySql 重置密码
    Difinition Of Done
    Apache, Tomcat, JK Configuration Example
    Linux 安装tomcat
  • 原文地址:https://www.cnblogs.com/liuyongjia/p/7696101.html
Copyright © 2011-2022 走看看