(call,apply和bind方法)

    1. var obj = {
    2. a: 1, // a是定义在对象obj中的属性
    3. fire: function () {
    4. console.log(this.a)
    5. }
    6. }
    7. var a = 2; // a是定义在全局环境中的变量
    8. var fireInGrobal = obj.fire;
    9. fireInGrobal(); // 输出2
    10. fireInGrobal.call(obj); // 输出1

    原本丢失了与obj绑定的this参数的fireInGrobal再次重新把this绑回到了obj

    但是,我们其实不太喜欢这种每次调用都要依赖call的方式,我们更希望:能够一次性 返回一个this被永久绑定到obj的fireInGrobal函数,这样我们就不必每次调用fireInGrobal都要在尾巴上加上call那么麻烦了。

    怎么办呢? 聪明的你一定能想到,在fireInGrobal.call(obj)外面包装一个函数不就可以了嘛!

    var obj = {
      a: 1, // a是定义在对象obj中的属性
      fire: function () {
      console.log(this.a)
      }
    }
    var a = 2; // a是定义在全局环境中的变量 
    var fn = obj.fire;
    var fireInGrobal = function () {
     fn.call(obj) //硬绑定
    }
    fireInGrobal(); // 输出1
    

    如果使用bind的话会更加简单

    var fireInGrobal = function () {
     fn.call(obj) //硬绑定
    }
    

    可以简化为:

    var fireInGrobal = fn.bind(obj)
    

    call和bind的区别是:在绑定this到对象参数的同时:
    1.call将立即执行该函数
    2.bind不执行函数,只返回一个可供执行的函数