bind 连续调用的 this 绑定

多次调用 bind 方法时,this 的绑定规则

问题

bind() 连续调用多次,this 的绑定值是什么?

解答

bind() 连续调用时,只有第一次 bind 的 this 值生效,后续的 bind 调用不会改变 this 指向。

var bar = function() {
    console.log(this.x);
}

var obj1 = { x: 1 };
var obj2 = { x: 2 };
var obj3 = { x: 3 };

var fn = bar.bind(obj1).bind(obj2).bind(obj3);
fn(); // 输出: 1

原因是 bind() 返回的是一个新函数,这个新函数的 this 已经被永久绑定。当对这个新函数再次调用 bind() 时,实际上是在一个已经绑定了 this 的函数上操作,无法改变其内部的 this 指向。

// 等价于
var fn1 = bar.bind(obj1);      // fn1 的 this 绑定为 obj1
var fn2 = fn1.bind(obj2);      // fn2 仍然指向 obj1
var fn3 = fn2.bind(obj3);      // fn3 仍然指向 obj1

关键点

  • bind 返回的函数 this 已被永久绑定,无法再次修改
  • 连续调用 bind 时,只有第一次的 this 绑定生效
  • 后续的 bind 调用会创建新函数,但不改变 this 指向