bind 和 apply、call 的区别


bind、apply、call 这三个方法都可以改变函数的 this(执行上下文)指向。

bind 和 apply、call 有所不同的是:bind 会返回一个改变了 this 指向的函数,不会自执行;而 apply、call 改变 this 执行后会立即执行函数。

apply、call 的区别在于传入的参数,两者的第一个参数都是传入的执行上下文,函数的执行参数以参数数组的形式传入 apply,而 call 的函数执行参数则是第二个参数开始传入。

function fn(msg) {
  console.log(msg)
  return this.a
}
var obj = {
  a: 1
}
var msg = '这是一条消息'

var bindFn = fn.bind(obj, msg)

var result1 = fn.apply(obj, [msg]) // 立即执行 输出 '这是一条消息'
var result2 = fn.call(obj, msg) // 立即执行 输出 '这是一条消息'

console.log(bindFn()) // 调用才执行 输出 '这是一条消息' 1

console.log(result1, result2) // 1 1