function foo() {
  return function() {
    console.log(this.a)
  }
}
let obj1 = {
  a: 'obj1'
}
let obj2 = {
  a: 'obj2'
}
let bar = foo.call(obj1)
bar.call(obj2) // obj2

普通的函数可以两次修改 this

function foo() {
  return a => {
    console.log(this.a)
  }
}
let obj1 = {
  a: 'obj1'
}
let obj2 = {
  a: 'obj2'
}
let bar = foo.call(obj1)
bar.call(obj2) // obj1
function foo() {
  this.a = 'obj'
  return a => {
    console.log(this.a)
  }
}
let obj1 = {
  a: 'obj1'
}
let obj2 = {
  a: 'obj2'
}
let bar = foo.call(obj1)
bar.call(obj2) // obj

使用箭头函数时, this 一旦被绑定,就不能修改 this 的指向。箭头函数会继承外层函数调用的 this 绑定。