首先,这三者的共同点是:

指向(也有对象继承的味道);

   二、第一个参数都是this要指向的对象;

   三、都可以利用后续参数传参;


写法分别是:

1.call ---> function.call(obj,参数,参数....);

2.apply ---> function.apply(obj,[数组]);

3.bind ---> function.bind(obj,参数,参数...);  或 

接着,根据例子来说下他们的区别

var xk = {
    name:"小k",
    age:20,
    sex:"男",
    say:function(){
       console.log(this.name + "今年" + this.age + "我是" + this.sex);
    }
}

var xz = {
   name:"小z",
   age:21,
   sex:"女"
}
xk.say();  //返回的肯定是小k的信息

但是怎么才能让它调用say返回小z的信息呢,这个时候就要用的call,apply,bind。

分别的用法是:

xk.say.call(xz);

xk.say.apply(xz);

xk.say.bind(xz)();   注:这儿直接调用不会有结果,因为bind返回的还是一个函数,所以后面要加括号。

那么call和apply的区别是什么呢?稍微改下例子:

var xk = {
    name:"小k",
    age:20,
    sex:"男",
    say:function(){
       alert(this.name + "今年" + this.age + "我是" + this.sex + "喜欢" + this.sport + "在" + this.xuexiao);
    }
}

var xz = {
   name:"小z",
   age:21,
   sex:"女"
}

这个时候就要在后面传参。

对于call就是这样:

xk.say.call(xz,"篮球","篮球学校");

而对于apply则是:

xk.say.apply(xz,["篮球","篮球学校"]);

注:因为apply的第二个参数是数组。

最后要注意的是,那么bind遇到这种情况怎么传参数呢?

首先它可以像call那样传参数(只是后面多一个括号):

xk.say.bind(xz,"篮球","篮球学校")();

还有一种方式是(在调用的时候再传参):

xk.say.bind(xz)("篮球","篮球学校");


以上这些就是笔者对js里的call、apply、bind的简浅理解。有不同看法或者补充的可以留言交流。