call、apply、bind 的区别

78 阅读1分钟

callapply 和 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返回一个绑定上下文的函数,而后两者是直接执行了函数。

总结

callapply是立即执行函数,并且传递给函数的参数方式不同(call是逐个传递,apply是以数组形式传递),而bind是返回一个新的函数,你需要另外调用它。