其实这个最简单理解就是改变this的指向的问题,bind中最直接明了的是永久改变了this的指向问题.

var a ={
    a:'haha',
    getA:function(){
        console.log(this.a)
    }
}
var  b ={
    a:'hello'
}
function run(fn){
   fn();
}
var getA = a.getA;//这里的输出的是'haha',this->a
var getA2 =getA.bind(a); //这里bind(a)使得里面的this->a



a.getA();//haha
getA();  //fun
run(a.getA); //这里是把a.getA直接作为参数来执行
getA2.call(b);//由于这里的this永久指向了a,就算call(b)也没用

而call()跟apply()的区别只是参数的不 同:

call(thisObj,Object)
apply(thisObj,[argArray])

 window.firstName = "diz";      
  window.lastName = "song";   
     var myname = { firstName: "my", lastName: "Object" };       
 function show() {    
    console.log("Hello " + this.firstName + " " +this.lastName, " glad to meet you!");
        }
        show();
        show.call(myname);

  希望对你的理解有帮助!!!!