call、apply 和 bind 是JavaScript中函数对象(Function object)的三种方法,它们都可以用于改变函数的调用上下文,即改变函数运行时的this指向。
共同点
改变函数内部 this 的指向
以 Function.prototype.call() 为例:
var obj = {
value: "新人报道",
};
function fn() {
console.log(this.value);
}
//将函数fn中的 this 指向 obj
fn.call(obj); // 新人报道
区别
call 和 apply的区别
除了传参的形式不同没什么区别。
传给fn的参数写法不同:
call接收多个参数,第一个参数为函数上下文也就是this,后边参数为函数本身的参数。apply接收两个参数,第一个参数为函数上下文this,第二个参数也是函数参数,只不过是以 数组 的形式传入的。
fn.call (thisArg, arg1, arg2, …)
fn.apply(thisArg, [argsArray])
thisArg (thisArgument) :在 fun 函数运行时指定的 this 值
bind()方法创建一个新的函数,在bind()被调用时,这个新函数的this被指定为bind()的第一个参数,而其余参数将作为新函数的参数,供调用时使用。
fn.bind (thisArg, arg1, arg2, …)
bind 是创建一个新函数,需要我们手动调用:
var a ={
name : "Cherry",
fn : function (a,b) {
console.log( a + b)
}
}
var b = a.fn;
// b.call(a,1,2);
// b.apply(a,[1,2])
b.bind(a,1,2)() // 3
bind 方法与 call / apply 最大的不同就是bind返回一个绑定上下文的函数,而后两者是直接执行了函数。
总结
call和apply是立即执行函数,并且传递给函数的参数方式不同(call是逐个传递,apply是以数组形式传递),而bind是返回一个新的函数,你需要另外调用它。