JavaScript为什么多次绑定只有一次生效?

1,115 阅读1分钟

接上篇文章JavaScript重识bind、call、apply

1、 先看一段代码:

function foo() {
    console.log("name: " + this.name);
}
var obj = { name: "obj" }, obj2 = { name: "obj2" }, obj3 = { name: "obj3" };
foo.bind(obj).call(obj2)  // name: obj
foo.bind(obj).bind(obj2)()  // name: obj

所以为什么bind只有第一次bind生效呢?

解释

这里想简单解释一下; foo.bind(obj).bind(obj2)() 从左到右执行;

  1. foo.bind(obj) 返回一个函数,这个函数其实回去执行 apply的操作,叫foo1; 那么在这次绑定是的是 foo.apply去绑定 obj;
  2. 然后 foo.bind(obj) 返回的这个函数,我们暂且称作fooB, 然后fooB.bind(obj2)又会返回一个要去执行apply的函数,叫 foo2; 就是foo.bind(obj).bind(obj2)了
  3. foo.bind(obj).bind(obj2)();

bind分解.png

结论

所以无论foo执行多少bind 都是第一次bind的对象!

后面的bind只能改变上一个bind的this指向,例如foo.bind(obj).bind(obj2) 改变的是 foo.bind(obj)的this指向是obj2; 最终foo执行是的绑定的this是由第一次bind的对象决定,即foo.bind(obj)的obj