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 指向
目录