call 、apply、 bind这三个方法有什么区别呢?分别适合应用在哪些场景中呢?
先举个简单的栗子 ~
var person = {
name: "axuebin",
age: 25
};
function say(job){
console.log(this.name+":"+this.age+" "+job);
}
say.call(person,"FE"); // axuebin:25 FE
say.apply(person,["FE"]); // axuebin:25 FE
var sayPerson = say.bind(person,"FE");
sayPerson(); // axuebin:25 FE
对于对象person而言,并没有say这样一个方法,通过call/apply/bind就可以将外部的say方法用于这个对象中,其实就是将say内部的this指向person这个对象。
call
call是属于所有Function的方法,也就是Function.prototype.call。
它的语法是这样的:
fun.call(thisArg[,arg1[,arg2,…]]);
其中,thisArg就是this指向,arg是指定的参数。
call的用处简而言之就是可以让call()中的对象调用当前对象所拥有的function。
apply
apply也是属于所有Function的方法,也就是Function.prototype.apply。
它的语法是这样的:
fun.apply(thisArg, [argsArray]);
其中,thisArg就是this指向,argsArray是指定的参数数组。
通过语法就可以看出call和apply的在参数上的一个区别:
call的参数是一个列表,将每个参数一个个列出来
apply的参数是一个数组,将每个参数放到一个数组中
bind
bind()方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列。
语法:
fun.bind(thisArg[, arg1[, arg2[, ...]]])
其中,thisArg就是this指向,arg是指定的参数。
可以看出,bind会创建一个新函数(称之为绑定函数),原函数的一个拷贝,也就是说不会像call和apply那样立即执行。
当这个绑定函数被调用时,它的this值传递给bind的一个参数,执行的参数是传入bind的其它参数和执行绑定函数时传入的参数。
总结:
- 三者都是用来改变函数的this指向
- 三者的第一个参数都是this指向的对象
- bind是返回一个绑定函数可稍后执行,call、apply是立即调用
- 三者都可以给定参数传递
- call给定参数需要将参数全部列出,apply给定参数数组