js 中 call apply bind

call 和 apply

1.方法定义

call方法:

  • 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])

    • 定义:调用一个对象的一个方法,以另一个对象替换当前对象。
  • 说明:

    • call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

apply方法:

  • 语法:apply([thisObj[,argArray]])

    • 定义:应用某一对象的一个方法,用另一个对象替换当前对象。
  • 说明:

    • 如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。
  • 用法

// 用法
const obj = {a:1};
function fn1(a,b,c){
  console.log(this, a, b, c)
}

fn1.call(obj,2,3,4); // 结果:{a: 1} 2 3 4
fn1.apply(obj,[2,3,4]); // 结果:{a: 1} 2 3 4
fn1(1,2,3); // 结果:Window{} 1 2 3
  • 3.总结
    call 和 apply 都会改变 函数执行时的this指向
    call 只能一个参数一个参数传递 而 apply 可以用数组方式传递多个参数类似解构

bind

  • 定义 (在EcmaScript5中扩展了叫bind的方法(IE6,7,8不支持))

  • 语法:function.bind(thisArg[, arg1[, arg2[, …]]])

  • 定义:调用一个对象的一个方法,以另一个对象替换当前对象。

  • 说明:

    • bind()方法创建一个新的函数,在调用时设置this关键字为提供的值。并在调用新函数时,将给定参数列表作为原函数的参数序列的前若干项。
  • 用法

// 用法

const obj = {a:1};
function fn1(a,b,c){
  console.log(this, a, b, c);
}

fn1.bind(obj,2,3,4); // 返回  fn1(a,b,c){console.log(this, a, b, c)} ???

fn1.bind(obj,2,3,4)(4,4,4); // 返回  {a: 1} 2 3 4  不能传递相同的参数

fn1(1,2,3); // 结果:Window{} 1 2 3
  • 总结
    bind 会返回改变上下文this后的函数 (并且传参后 函数不能再传递这个参数)
    call 会执行 带有 指定上下问this 函数