相同点 都是改变this指向的
不同点 :
首先是传递参数不同
call和bind可以直接写多个参数
apply如果想传递多个参数 需要用数组方法,只有两个参数
call和apply是对函数进行直接调用 bind方法是返回的仍然是一个函数
应用场景
1:参数的形式是数组的时候,比如apply里面传递了参数arguments,参数是数组类型,并且在调用Person的时候参数的列表是对应一致的就用 apply。
2:如果Person的参数列表是这样的(age,name),而Student的参数列表是(name,age,grade),这样就可以用call来实现了,也就是直接指定参数列表对应值的位置(Person.call(this,age,name,grade));call方法:
call(指向对象,x,y,z,…)
apply方法:apply(指向对象,[x,y,z])
3:bind方法在调用的时候也可传参,另外bind不兼容ie6-8
var a ={
name:'一一',
age:'22',
sex:'女',
hobby:'写代码'
say:function(sex,hobby) {
console.log(this.name,this.age,sex,hobby)
}
}
var b = {
name:'二二',
age:'23',
}
a.say.call(b,'男','学习');
//李明明 22 男 学习
a.say.apply(b,['男','学习'])
//李明明 22 男 学习
bind可以向cally一样传参:
例如:
a.say.bind(b,'男','学习')();
//李明明 22 男 学习
但由于bind返回的仍然是一个函数,所以我们还可以在调用的时候再进行传参。
例如:
a.say.bind(b)('男','学习');
//李明明 22 男 学习
注意:如果不传参数,或者第一个参数是null
或nudefined
,this
都指向window