首先他们的作用都是改变this的指向(就是给this赋值)
call 方法调用一个函数, 其具有一个指定的 this 值和分别地提供的参数(参数的列表)。
注意:该方法的作用和 apply() 方法类似,只有一个区别,就是 call()方法接受的是若干个参数的列表,而 apply()方法接受的是一个包含多个参数的数组
apply()方法调用一个具有给定 this 值的函数,以及作为一个数组(或类似数组对象)提供的参数。
注意:call()方法的作用和 apply() 方法类似,区别就是 call()方法接受的是参数列表,而 apply()方法接受的是一个参数数组
bind()方法创建一个新的函数,当这个新的函数被调用时,其 this 置为提供的值,其参数列表前几项,置为创建时指定的参数序列
区别:
1、入参方面 call、bind都是接收一个个逗号隔开的参数,apply接收的是数组
2、使用入参的时候都一样,apply入参是数组,取的时候还是跟call,bind一样一个个逗号隔开
3、call、apply是立即执行this赋值,bind返回了一个函数,需要手动执行了才会给this赋值
通过下面的代码来理解
var a = function(name, name1){
this.name = name;
this.name1 = name1;
}
var b = function(name){
this.name = name
}
var c = function(name){
this.name1 = name
}
var d = {};
// 顺序执行
a.call(d,'a', 'a'); // d = { name: 'a', name1: 'a' }
b.call(d, 'b'); // d = { name: 'b', name1: 'a' }
c.call(d, 'c'); // d = { name: 'b', name1: 'c' }
// 使用appply实现一样的效果
a.apply(d, ['a', 'a'])
b.apply(d, ['b'])
c.apply(d, ['c'])
// 使用bind
var e = a.bind(d, 'a', 'a');
// bind返回了一个新函数,没有执行不会赋值
e();
// 一般写成立即执行
a.bind(d, 'a', 'a')()